どのプログラミング言語で「let」が最初に現れましたか?


24

Lisp、Clojure、Haskellで使用される「let」の起源について疑問に思っていました。誰が最初に登場した言語を知っていますか?


アセンブラーは、1954年のLETの代わりにMOVを使用します。十分ではありませんか?
ガンヌス14

1
LISPは良い候補になるのに十分な年齢です。
ムービシエル14

2
「プログラミング言語は、Xが最初に表示されたものの中で、」すべての質問にはLispは正しい答えのためのかなり良いの推測ではある
ザカリーK

2
起源は他のプログラミング言語ではなく、数学に由来するものとします。
ピーターB 14

プログラミング言語で最初に「let」を使用するのは、Lisp、Clojure、およびHaskellで「let」を使用することの起源であるという誤った仮定を立てます。
ピーターB 14

回答:


41

さて、BASICは持っていたLETことが、使用に先行しまうので、1964年に開始されてから構文の一部として割り当てのためにletクリス・ジェスター・ヤングが指摘するようによると、1970年代までは表示されませんでした、LispでのLispの進化

COBOL、Fortran、ALGOLのLETいずれかの構文に含まれているとは思わない。だから私はベーシックに行きます。


11
しかし、セマンティクスは非常に異なります- let基本的には、レキシカルスコープのバインディングではありません。したがって、正解は「12世紀以前に最初に英語で登場した」ようなものになります。
SKロジック

12
しかし、質問は次のとおりです。「let」が最初に表示されたプログラミング言語は何ですか?私は英語を(少なくともこの文脈では)プログラミング言語とは本当に考えていません。
グレッグ

7
letこのコンテキスト(letx is何かin次の表現)で最初に英語の数学テキストに登場しました。これがプログラミングの始まりです。フォーマルなシステム(数学言語、プログラミング言語など)に違いはありませんが、それらはすべて同じです。
SKロジック

3
「let x is 3」は適切な文法ではありません。英語の教科書ではそれを見ることはないでしょう。あなたは、動詞「する」の時制が間違っています。「let x be 3」または「let x equal 3」にする必要があります。どちらにしても、意味論であるかどうかにかかわらず、質問の著者はプログラミング言語を求めていました。だから、BASICより前の英語の指示を受け取るコンピューターを知っていなければ、私はそれを買わない。そうでなければ、「擬似コード」と答えただけで、それは有効でしょうが、彼女の質問の精神を尊重しません。
グレッグ

1
もちろんML表記を使用しましたがequals、ではありませんis。そして、はい、これまでのところ、擬似コードが最良の答えです。
SKロジック

30

理論的な観点を追加したいと思います。古典的なラムダ計算で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


非常に興味深い答えを得るために+1。サイドトピックとして、もし知っているなら、「シンタックスシュガー」の厳密な定義への参照を(コメントで、これは主要な質問に関連していないので)投稿できますか。
ジョルジオ

3
@Giorgio 新しいハッカーの辞書を引用するには:言語または他の形式主義に追加された機能で、人間にとって「より甘い」ものにする機能、形式主義の表現力に影響を与えない機能。使用されたESP。「砂糖」の特徴が、表記法にすでに存在する他の構成要素に明白で些細な翻訳がある場合。Cのa[i]表記は、の構文糖です*(a + i) ウィキペディアの記事にも説明があります。
ペトルスキー-パドラック

3
面白いものはほとんどに関連していないletの導入
wirrbel

2
これはよく書かれた答えですが、元の質問には答えません。
ヨハンカールソン14

1
@JohanKarlsson私はそれが直接的な答えだと主張しているわけではありませんが、これはトピックにも関連していると思います。特に、なぜされたletとの質問が始まると、導入私は...「せ」の起源についての疑問だった
ペトルスキー-パドラック

22

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

ショートコードは1949年にジョンモークリーによって提案されました

X3 =  (  X1 +  Y1 )  /  X1 * Y1   

Burksの中間PL、1950年、割り当てに使用 ->

1952年のRutishauserの使用 =>=

Böhmsコンパイラ、1952年、使用 ->

マンチェスター大学で、アリックグレンニーはAutocode1950年代初頭に開発されました。最初のコードとコンパイラーは、マンチェスター大学のMark 1コンピューター用に1952年に開発され、最初にコンパイルされた高レベルのプログラミング言語と見なされています。繰り返しますが、->割り当て

チャールズアダムス、バッカスのグループのFORTRAN 0、ブルッカーのオートコード2、ルビムスキーとカミニンのПП1。すべて1954年、再び=

BACAIC(グレムス、ポーター)、1954年、*割り当て用!

Kompiler、ADES、1955、 =

IT、1956、 <-

FORTRAN、1957、 =

AT-3(1956)、Math-Matic(1957)、再び=

しかし、1957年のFlow-Maticには2つの割り当てがあり、両方とも言葉で

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

14

さて、これら3つの間で、Lispは間違いなく最初にそれを持ちました。Haskellは80年代に約来て、Clojureの00sの中に、そしてlet周りされていた長いこれらの日付のいずれかの前に。:-)

Lispがそれを発明し言語であるかどうかについては、私はまだそれを保証することはできませんが、私はいくつかの研究をして見ます。:-)

更新:Lispの進化(46ページを参照)によるとlet、70年代に発明されたと述べています。

LETそれ自体がマクロであり、各サイトで最初にローカルで最初に発明され、再発明されたものであり、MacLispの世界では後発的でした。Lisp Archiveによれば、1979年にLisp-Machine LispからPDP-10 MacLispに遡って吸収され、同時にDEFMACRO複雑なLisp Machine DEFUN引数構文になりました。

もちろん、それが以前に別の言語で発明されたかどうかはまだ完全には答えていませんが、まだ別のデータポイントです。:-)


4
MLも70年代に開発されたため、その期間にMLとLispの両方でアイデアが導入された可能性があります。
ジョルジオ

9

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))

letLisp方言では常に語彙的にスコープされましたか?
ウィルベル

1
AIM-452は、Schemeに関する最初の改訂レポートです。最初のレポートは1975年のAIM-349です。AIM-848は改訂された改訂レポートです。その後、「revised ^ 3」レポートと呼ばれるもの(つまり、「R ^ nRS」という命名法を使用した最初のレポート)は、AIMではなく実際の言語仕様でした。少しグーグルで検索すると、これらすべてのドキュメントのPDFが見つかるので、自分で読むことができます。さらに前に戻りたい場合は、Software Preservation Groupの古いMacLispマニュアルを見つけることができます。また、LISP 1.5レポートも見つけることができます。
TaylanUB 14

@wirrbel、それletはレキシカルスコーピングとほぼ同じくらい古く(Scheme、'75)、レキシカルスコーピングが受け入れられるまでに少し時間がかかったので、最初のインスタンスletは動的スコープのLispのコンテキストにあったと思います。現在、Emacs Lispにはデフォルトで動的スコープがあり、lambdaand let(とにかく後者は前者の糖)はパラメータを動的にバインドします。
タイランUB 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.