浩晨众云网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Pyret 是一门基于 JavaScript 的脚本语言,旨在成为编程教育的绝佳选择,同时探索脚本语言和函数式编程的融合。目前 Pyret 正处于积极设计和开发阶段,开发者可以自由使用或对其进行修改。

成都创新互联公司-专业网站定制、快速模板网站建设、高性价比榆中网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式榆中网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖榆中地区。费用合理售后完善,10余年实体公司更值得信赖。
Pyret 具有受 Python 启发的函数、列表和运算符语法,其迭代结构 (Iteration constructs) 的设计为了调用其他语言中的迭代结构。
- fun to-celsius(f):
 - (f - 32) * (5 / 9)
 - end
 - for each(str from [list: "Ahoy", "world!"]):
 - print(str)
 - end
 
Pyret 支持简洁、富有表现力、递归的数据声明,支持可选的类型注释,支持增量添加,以满足各种教学风格和课程需求。
- data BinTree:
 - | leaf
 - | node(value, left :: BinTree, right :: BinTree)
 - end
 
Pyret 的测试是编程过程的自然组成部分。函数可以在where:子句中结束,该子句为函数提供了单元测试,并且这些断言 (Assertions) 会被动态检查。
- fun sum(l):
 - cases (List) l:
 - | empty => 0
 - | link(first, rest) => first + sum(rest)
 - end
 - where:
 - sum([list: ]) is 0
 - sum([list: 1, 2, 3]) is 6
 - end
 
对于缩进的问题,Pyret 团队认为缩进对于代码的可读性至关重要,但他们不希望通过程序的空格来确定其含义。相反,程序的含义应该决定它的缩进结构。缩进只是另一个上下文敏感的规则。
明确的语法(Pyret 使用显式end分隔符的原因)意味着开发者可以从电子邮件或 Web 复制和粘贴代码,而不会改变其含义。IDE 会帮助开发者重新缩进代码,无需担心这样做会改变程序的含义。
与大多数脚本编程语言不一样,Pyret 支持开箱即用地检查参数上的注解。
Python
- def square(n : int) -> int:
 - return n * n
 - square("5")
 - # Error at multiplication:
 - # Can't multiply sequence by
 - # non-int of type 'str'
 
Pyret
- fun square(n :: Number) -> Number:
 - n * n
 - end
 - square("5")
 - # With type checker off:
 - # The Number annotation was not
 - # satisfied by the value "5"
 - # With type checker on:
 - # Number is incompatible with String
 
Java
- // this is not true
 - ((1 / 3) * 3) == 1
 
Pyret
- # this is true
 - ((1 / 3) * 3) == 1
 
Pyret 为编写数据定义提供了优雅的机制,而无需开发者具备对类的认知背景,以及语法开销。
Python
- class BinTree:
 - pass
 - class leaf(BinTree):
 - def __init__(self):
 - pass
 - class node(BinTree):
 - def __init__(self, v, l, r):
 - self.v = v
 - self.l = l
 - self.r = r
 
Pyret
- data BinTree:
 - | leaf
 - | node(v, l, r)
 - end
 
Pyret 在使用结构化数据方面也非常灵活,并在其底层公开了一个简单的对象模式,支持结构化代码与更多 nominal 模式搭配使用。
OCaml
- type animal =
 - | Elephant of string * float
 - | Tiger of string * float
 - | Horse of string * int
 - ...
 - let name_of_animal a =
 - match a with
 - | Elephant(name, _)
 - | Tiger(name, _)
 - | Horse(name, _) -> name
 - ...
 
Pyret
- data Animal:
 - | elephant(name, weight)
 - | tiger(name, stripes)
 - | horse(name, races-won)
 - ...
 - end
 - fun animal-name(a :: Animal):
 - a.name
 - end
 
Racket
- (struct elephant (name weight))
 - (struct tiger (name stripes))
 - (struct horse (name races-won))
 - ...
 - (define (animal-name a)
 - (cond
 - [(elephant? a) (elephant-name a)]
 - [(tiger? a) (tiger-name a)]
 - [(horse? a) (horse-name a)]
 - ...))
 
Pyret
- data Animal:
 - | elephant(name, weight)
 - | tiger(name, stripes)
 - | horse(name, races-won)
 - ...
 - end
 - fun animal-name(a :: Animal):
 - a.name
 - end
 
通过访问 code.pyret.org 直接在浏览器中运行 Pyret,这是最简单的入门方法。查看导览以了解小部分程序和语法示例。
如果希望在命令行中在使用 Pyret 进行编程,需要从 https://www.npmjs.com/package/pyret-npm 安装pyret-npm,安装命令如下:
- npm install -g pyret-npm
 
根据 Pyret 的官网介绍,目前该项目正在积极开发三个非常重要的功能:
其团队认为 Pyret 也已经足够成熟,因为它实现了自托管编译器。这意味着,当开发者在浏览器中运行 Pyret 时,它会加载实现了 Pyret-to-JavaScript 编译器的 JavaScript 代码(即开发者输入的 Pyret 代码会编译成 JavaScript 并在浏览器中运行)。这个编译器是由 Pyret-to-JavaScript 编译器通过编译 Pyret-to-JavaScript 编译器产生的。
本文转自OSCHINA
本文标题:Pyret 编程语言:探索脚本语言和函数式编程的融合
本文地址:https://www.oschina.net/news/156822/pyret-language