Je me demandais des origines du "let" utilisé dans Lisp, Clojure et Haskell. Est-ce que quelqu'un sait quelle langue il apparut en premier?
Eh bien, [~ # ~] BASIC [~ # ~ ~] avait LET
pour la mission dans le cadre de la syntaxe du début en 1964, afin de prédire l'utilisation de let
dans Lisp, que, comme le souligne Chris Jester-Young, n'apparaissait pas que les années 1970 selon Evolution de LISP .
Je ne crois pas que Cobol, Fortran ou Algol ont LET
dans leur syntaxe non plus. Donc, je vais aller avec de base.
J'aimerais ajouter un point de vue théorique: dans Calmbda Calculi classique, let
est juste le sucre syntaxique. Par exemple
let x = N in M
peut être réécrit simplement comme
(λx.M)N
Donc, sa première apparition au début des langues (fonctionnelles) n'est pas si intéressante.
Cependant, il devient très important avec l'invention de Hindley-Milner Système de type et son algorithme d'inférence de type. Dans ce type de type let
est indispensable, car il est polymorphe (contrairement à λ-abstraction dans HM). Par exemple, considérons cette expression simple:
let id = λx . x in id id
Ici id
est polymorphe, il a du type ∀α.α → α
, et donc id id
Type-Checks - Son type est id id : τ → τ
pour arbitraire τ. (Pour le premier id
nous attribuons τ → τ
à α
et pour la deuxième id
nous attribuons τ
pour α
.)
Cependant, nous ne pouvons pas la réécrire en utilisant l'abstraction et l'application λ. Expression
(λid . id id)(λx.x)
ne tape pas, car dans la première abstraction _ id
doit être attribuée à un type monomorphique id : σ
pour certains σ, et il n'y a pas σ tel que nous pouvions appliquer id : σ
à id : σ
.
Vous pouvez essayer cela vous-même à Haskell. Tandis que let id = \x -> x in id id :: t -> t
Type-Checks, en tapant (\id -> id id)(\x -> x)
échoue avec
Cochez la case: Impossible de construire le type infini:
t0 = t0 -> t0
[.____] Dans le premier argument deid
, à savoirid
[.____] Dans l'expression:id id
[.____] Dans l'expression:\id -> id id
Lisp est la langue la plus ancienne de ceux-ci ayant laissé maintenant. Mais la base était la première qui l'a eue, car Lisp l'avait obtenu beaucoup plus tard.
Dans Ada Lovelace Analytical Moteur (1843) - Non, un programme ressemble à:
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
Dans Plankalcül de Zuse (1943-45), le programme regarde:
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
Le code abrégé a été proposé par John Mauchly en 1949
X3 = ( X1 + Y1 ) / X1 * Y1
PL de burkins intermédiaire, 1950, utilisé pour la mission ->
Rutishauser en 1952 d'occasion =>=
Böhms Compiler, 1952, utilisé ->
À l'Université de Manchester, Alick Glennie a développé Autocode
au début des années 1950. Le premier code et le compilateur a été développé en 1952 pour l'ordinateur Mark 1 de l'Université de Manchester et est considéré comme le premier langage de programmation de haut niveau compilé. De nouveau, ->
pour la mission
Charles Adams, Fortran 0 de groupe de Backus, Autocode 2, Пп1 de Lubimsky et Kamynin; Tout en 1954, encore une fois =
Bacaic (Grems, Porter), 1954, *
pour la mission!
Kompiler, Ades, 1955, =
Il, 1956, <-
Fortran, 1957, =
AT1956), Math-Matic (1957), encore une fois =
,
mais le flow-Matic en 1957 avait deux missions et les deux sont en mots
TRANSFER a TO b
et MOVE a TO b
Machine de Bauer et Samelson, 1957: =>
Désolé, je ne peux pas couvrir toutes les langues entre 1957 et 1964, mais plus grandes langues
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)
n'ont pas laissé pour la mission. Ou n'avait pas , dans le cas de LISP.
--- (Dartmouth Basic est la version originale du langage de programmation de base. La première version interactive a été mise à la disposition des utilisateurs généraux à juin 1964;
LET / = — assign formula results to a variable
Eh bien, entre ces trois, Lisp l'avait certainement d'abord. Haskell est venu dans les années 80 et Clojure dans 00, et let
avait été autour Long avant l'une de ces dates. :-)
Quant à savoir si Lisp était le Langue pour l'avoir inventé, je ne peux pas garantir à cela, mais je vais faire des recherches et voir. :-)
MISE À JOUR: Selon - Evolution du LISP (voir page 46), il a mentionné que let
a été inventé dans les années 70:
LET
- elle-même une macro inventée et réinventée localement sur chaque site - était une barre tardive dans le monde MacLisp; Selon les archives LISP, il a été absorbé de manière rétroactive dans le PDP-10 MacLisp de Lisp-machine Lisp en 1979 en même temps queDEFMACRO
et la machine complexe LISPDEFUN
Syntaxe d'argument.
N'a toujours pas répondu si elle a été inventée dans une autre langue plus tôt, bien sûr, mais toujours un autre point de données. :-)
Le premier rapport de programme révisé AIM-452 à partir de janvier 1978 a LET
. Page 9.
notez que LISP utilisait plus tôt une construction différente PROG
pour introduire des variables locales.
(let ((a 1)
(b 1))
(+ a b))
aurait été écrit plus tôt approximativement comme
(prog (a b)
(setq a 1)
(setq b 1)
(+ a b))