Lisp、Clojure、Haskellで使用される「let」の起源について疑問に思っていました。誰が最初に登場した言語を知っていますか?
Lisp、Clojure、Haskellで使用される「let」の起源について疑問に思っていました。誰が最初に登場した言語を知っていますか?
回答:
さて、BASICは持っていたLET
ことが、使用に先行しまうので、1964年に開始されてから構文の一部として割り当てのためにlet
クリス・ジェスター・ヤングが指摘するようによると、1970年代までは表示されませんでした、LispでのLispの進化。
COBOL、Fortran、ALGOLのLET
いずれかの構文に含まれているとは思わない。だから私はベーシックに行きます。
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
との質問が始まると、導入私は...「せ」の起源についての疑問だった
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年、使用 ->
マンチェスター大学で、アリックグレンニーはAutocode
1950年代初頭に開発されました。最初のコードとコンパイラーは、マンチェスター大学の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
さて、これら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 MachineDEFUN
引数構文になりました。
もちろん、それが以前に別の言語で発明されたかどうかはまだ完全には答えていませんが、まだ別のデータポイントです。:-)
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
は動的スコープのLispのコンテキストにあったと思います。現在、Emacs Lispにはデフォルトで動的スコープがあり、lambda
and let
(とにかく後者は前者の糖)はパラメータを動的にバインドします。