LISP、Clojure、Haskellで使用されている「let」の起源について疑問に思っていました。最初に登場した言語を知っている人はいますか?
まあ、 [〜#〜] basic [〜#〜] は、164年の初めから構文の一部として割り当て用にLET
があったため、let
はLISPで、Chris Jester-Youngが指摘したように、 Evolution of LISP によると1970年代まで現れませんでした。
COBOL、Fortran、またはALGOLの構文にもLET
があるとは思いません。だから私はBASICで行くつもりです。
理論的な視点を追加したいと思います。古典的なラムダ計算では、let
は単なる構文上の砂糖です。例えば
let x = N in M
簡単に書き直すことができます
(λx.M)N
したがって、初期の(関数)言語での最初の登場はそれほど興味深いものではありません。
しかし、それは Hindley-Milner 型システムとその型推論アルゴリズムの発明で非常に重要になります。この型システムでは多形性があるため、let
は不可欠です(HMのλ抽象化とは異なります)。たとえば、次の単純な式を考えます。
let id = λx . x in id id
ここでid
は多態性であり、型は∀α.α → α
であるため、id id
型チェック-任意のτの型はid id : τ → τ
です。 (最初のid
の場合はτ → τ
をα
に割り当て、2番目の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
LISPは、LET nowを持つ最も古い言語です。しかし、BASICが最初に入手したのは、LISPが後で入手したためです。
Ada Lovelace分析エンジン(1843)-LETがない場合、プログラムは次のようになります。
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
ズーゼのプランカルケル(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
割り当てに使用されるバークスの中間PL、1950、->
1952年にRutishauserが使用した=>=
ベームスコンパイラ、1952年、使用済み->
マンチェスター大学では、1950年代初頭にAlick GlennieがAutocode
を開発しました。最初のコードとコンパイラは、1952年にマンチェスター大学のMark 1コンピュータ用に開発され、最初にコンパイルされた高水準プログラミング言語と見なされています。繰り返しますが、->
割り当て用
チャールズアダムス、バッカスグループのFORTRAN 0、ブルッカーズオートコード2、ルビムスキーとカミニンのПП1。すべて1954年に再び=
バカイック(グレムス、ポーター)、1954年、*
割り当て用!
Kompiler、ADES、1955、=
IT、1956年、<-
FORTRAN、1957年、=
AT1956)、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は00年代に登場しました。let
はこれらの日付の前にlong前後でした。 :-)
LISPがそれを発明したthe言語であったかどうかについては、まだ保証できませんが、調査して確認します。 :-)
更新: Evolution of LISP (46ページを参照)によれば、let
は70年代に発明されたと述べています:
LET
—それ自体が最初に発明され、各サイトでローカルに再発明されたマクロ—は、MacLispの世界に遅れをとっていました。 LISP Archiveによれば、DEFMACRO
および複雑なLISP MachineDEFUN
引数構文と同時に、1979年に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))