我想知道Lisp,Clojure和Haskell中使用的“ let”的起源。有人知道它最初出现哪种语言吗?
我想知道Lisp,Clojure和Haskell中使用的“ let”的起源。有人知道它最初出现哪种语言吗?
Answers:
好吧,BASICLET
从1964年开始就必须将赋值作为语法的一部分,因此这要早于let
在Lisp中使用,正如Chris Jester-Young指出的那样,直到1990年代才根据Lisp的演变出现。
我也不相信COBOL,Fortran或ALGOL LET
的语法也是如此。因此,我将选择BASIC。
let
从根本上讲,这不是一个词法范围的绑定。因此,正确的答案应该是“它在12世纪之前以英语首次出现”。
let
在这种情况下(let
X is
的东西in
下面的表达式)在数学文最早出现在英语,这是它进入了编程。我认为形式系统之间没有什么区别-数学语言,编程语言等等-它们都是相同的。
equals
不是is
。而且,是的,到目前为止,伪代码是最好的答案。
我想补充一下理论上的观点:在经典的λ结石中,let
只是语法糖。例如
let x = N in M
可以简单地重写为
(λx.M)N
因此,它在早期(功能性)语言中的首次出现并不是那么有趣。
但是,随着Hindley-Milner类型系统及其类型推断算法的发明,这一点变得非常重要。在这种类型的系统let
中必不可少,因为它是多态的(不同于HM中的λ-抽象)。例如,考虑以下简单表达式:
let id = λx . x in id id
这id
是多态的,它具有type ∀α.α → α
,因此要进行id id
类型检查-它的类型适用id id : τ → τ
于任意τ。(对于第一个,id
我们分配τ → τ
给α
,对于第二个,id
我们分配τ
给α
。)
但是,我们无法使用λ抽象和应用程序对其进行重写。表达
(λid . id id)(λx.x)
没有类型检查,因为第一个λ抽象内id
必须分配单态型id : σ
的一些σ,并没有这样的σ,我们可以申请id : σ
到id : σ
。
您可以在Haskell中自己尝试。在进行let id = \x -> x in id id :: t -> t
类型检查时,键入(\id -> id id)(\x -> x)
失败并显示
发生检查:不能构造无限类型:
t0 = t0 -> t0
在的第一个参数中id
,即id
在表达式中:id id
在表达式中:\id -> id id
a[i]
表示法是的语法糖*(a + i)
。 维基百科文章也有很好的解释。
let
的介绍
let
介绍,因为问题始于我想知道“ let”的起源?
Lisp是现在拥有LET的最古老的语言。但是BASIC是第一个获得它的,因为Lisp后来才获得它。
在Ada Lovelace Analytical Engine(1843)-无LET中,程序看起来像:
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
在Zuse的Plankalkül(1943-45)中,程序看起来如下:
P1 max3 (V0[:8.0],V1[:8.0],V2[:8.0]) → R0[:8.0]
max(V0[:8.0],V1[:8.0]) → Z1[:8.0]
max(Z1[:8.0],V2[:8.0]) → R0[:8.0]
END
短代码由John Mauchly在1949年提出
X3 = ( X1 + Y1 ) / X1 * Y1
Burks的中级PL,1950年,用于分配 ->
Rutishauser在1952年二手 =>=
Böhms编译器,1952年,使用过 ->
在曼彻斯特大学,阿里克·格兰尼(Alick Glennie)Autocode
于1950年代初发展。第一个代码和编译器是1952年为曼彻斯特大学的Mark 1计算机开发的,被认为是第一种编译的高级编程语言。再次,->
分配
查尔斯·亚当斯(Charles Adams),Backus小组的FORTRAN 0,布鲁克的自动编码2,鲁宾斯基和卡米宁的ПП1;都是在1954年=
BACAIC(格林斯,波特),1954年,*
分配!
1955年,ADES,孔普勒, =
IT,1956年, <-
1957年,FORTRAN, =
AT-3(1956),Math-Matic(1957),再一次=
,
但在1957年,Flow-Matic进行了两项任务,并且两者都是用语言表达的
TRANSFER a TO b
和 MOVE a TO b
鲍尔和萨梅森的机器,1957年: =>
抱歉,我无法涵盖1957年至1964年之间的所有语言,但涵盖更多语言
1957 - COMTRAN (forerunner to COBOL)
1958 - LISP
1958 - ALGOL 58
1959 - FACT (forerunner to COBOL)
1959 - COBOL
1959 - RPG
1962 - APL
1962 - Simula
1962 - SNOBOL
1963 - CPL (forerunner to C)
还没有LET分配。还是没有,在LISP的情况下。
Dartmouth BASIC是BASIC编程语言的原始版本。第一个交互式版本于1964年6月提供给普通用户;
LET / = — assign formula results to a variable
好吧,在这三个之间,Lisp肯定是第一个。哈斯克尔是约在上世纪80年代,和Clojure的在00年代,并let
一直围绕长之前,无论是这些日期的。:-)
关于Lisp是否是发明它的语言,我尚不能保证,但是我将做一些研究并看看。:-)
更新:根据《 Lisp的演变》(请参阅第46页),它提到let
了70年代发明的:
LET
-本身是在每个站点上首先在本地发明和重新发明的宏-后来才进入MacLisp世界;根据Lisp Archive的说法,它是在1979年DEFMACRO
与复杂的Lisp MachineDEFUN
参数语法同时从Lisp-Machine Lisp追溯吸收到PDP-10 MacLisp中的。
当然,仍然不能完全回答它是否是另一种语言的发明,但这仍然是另一个数据点。:-)
1978年1月发布的第一份修订方案报告AIM-452已有LET
。第9页
请注意,Lisp之前使用了不同的构造PROG
来引入局部变量。
(let ((a 1)
(b 1))
(+ a b))
本来可以写成大约
(prog (a b)
(setq a 1)
(setq b 1)
(+ a b))
let
总词汇用Lisp方言作用域?
let
与词法作用域大约一样古老(Scheme,'75),并且词法作用域需要一段时间才能获得认可,所以我猜想的第一个实例let
是在动态作用域Lisps的上下文中。如今,Emacs Lisp默认仍然具有动态作用域,并且lambda
和let
(无论如何,后者都是前者)动态绑定其参数。