In welcher Programmiersprache ist „let“ zuerst aufgetaucht?


24

Ich wunderte mich über die Ursprünge des Let in Lisp, Clojure und Haskell. Weiß jemand, in welcher Sprache es zuerst erschien?


Assembler verwendet MOV anstelle von LET aus dem Jahr 1954. Reicht das nicht aus?
Gangnus

1
LISP ist alt genug, um ein guter Kandidat zu sein.
Mouviciel

2
für jede frage "in welcher programmiersprache ist x zuerst aufgetaucht" lisp ist eine ziemlich gute schätzung für eine korrekte antwort
zachary k

2
Lassen Sie die Ursprünge aus der Mathematik kommen, nicht aus anderen Programmiersprachen.
Pieter B

Sie gehen fälschlicherweise davon aus, dass die erste Verwendung von "let" in einer Programmiersprache der Ursprung von "let" -use in Lisp, Clojure und Haskell ist.
Pieter B

Antworten:


41

Nun, BASIC musste LETvon Anfang an 1964 als Teil der Syntax zugewiesen werden, damit dies vor der Verwendung letin Lisp stattfand, was laut Evolution of Lisp , wie Chris Jester-Young betont, erst in den 1970er Jahren auftrat .

Ich glaube nicht, dass COBOL, Fortran oder ALGOL LETin ihrer Syntax haben. Also werde ich mit BASIC gehen.


11
Aber die Semantik ist ganz anders - letim Grunde ist es keine lexikalisch ausgerichtete Bindung. Die richtige Antwort wäre also so etwas wie "es erschien zuerst auf Englisch, vor dem 12. Jahrhundert".
SK-Logik

12
Aber die Frage ist: In welcher Programmiersprache ist das "let" zuerst aufgetaucht? Ich halte Englisch nicht wirklich für eine Programmiersprache (zumindest in diesem Zusammenhang).
Greg

7
letin diesem Zusammenhang tauchte ( letx isetwas inder folgende Ausdruck) erstmals in mathematischen Texten auf Englisch auf, und hier kam es zur Programmierung. Ich sehe keinen Unterschied zwischen formalen Systemen - mathematische Sprachen, Programmiersprachen, was auch immer - sie sind alle gleich.
SK-logic

3
"let x is 3" ist keine richtige Grammatik. Das würde man in keinem englischen Lehrbuch sehen. Sie haben die falsche Zeitform des Verbs "sein". Es sollte "let x be 3" oder "let x equal 3" sein. Wie auch immer, Semantik oder nicht, der Frageautor fragte nach einer Programmiersprache. Wenn Sie also nicht wissen, dass ein Computer englische Anweisungen enthält, die älter sind als BASIC, werde ich ihn nicht kaufen. Andernfalls hätten wir einfach "Pseudocode" beantworten können, und das wäre gültig, würde aber dem Geist ihrer Frage nicht gerecht werden.
Greg

1
Natürlich habe ich die ML-Notation benutzt, und ich meinte equals, nicht is. Und ja, Pseudocode ist die bisher beste Antwort.
SK-logic

30

Ich möchte eine theoretische Sichtweise hinzufügen: In der klassischen Lambda-Rechnung letist es nur syntaktischer Zucker. Beispielsweise

let x = N in M

kann einfach umgeschrieben werden als

(λx.M)N

Daher ist sein erster Auftritt in frühen (funktionalen) Sprachen nicht so interessant.

Es wird jedoch mit der Erfindung des Hindley-Milner- Typ-Systems und seines Typ-Inferenz-Algorithmus sehr wichtig . In diesem Typ System letist unverzichtbar, weil es polymorph ist (im Gegensatz zu λ-Abstraktion in HM). Betrachten Sie beispielsweise diesen einfachen Ausdruck:

let id = λx . x in id id

Hier idist polymorph, es hat Typ ∀α.α → αund daher id idTypprüfungen - sein Typ ist id id : τ → τfür willkürliches τ. (Für den ersten idwir assign τ → τzu αund für die zweiteid wir assign τfür α.)

Wir können es jedoch nicht mit λ-Abstraktion und -Anwendung umschreiben. Ausdruck

(λid . id id)(λx.x)

nicht geben Prüfung, weil innerhalb der ersten λ Abstraktion idmuss einen monomorphen Typ zugeordnet werden id : σfür einige σ, und es gibt keine σ , so dass wir anwenden könnten id : σzu id : σ.

Sie können dies selbst in Haskell versuchen. Während der let id = \x -> x in id id :: t -> tTypprüfung (\id -> id id)(\x -> x)schlägt die Eingabe mit fehl

Tritt ein check: kann den unendlichen Typ nicht konstruieren: t0 = t0 -> t0
Im ersten Argument von id, nämlich id
Im Ausdruck: id id
Im Ausdruck:\id -> id id


+1 für eine sehr interessante Antwort. Wenn Sie ein Nebenthema kennen, können Sie (in einem Kommentar, da dies nicht mit der Hauptfrage zusammenhängt) einen Verweis auf eine strenge Definition des Begriffs "syntaktischer Zucker" veröffentlichen.
Giorgio

3
@Giorgio So zitieren Sie das Wörterbuch des neuen Hackers : Funktionen, die einer Sprache oder einem anderen Formalismus hinzugefügt wurden, um sie für den Menschen "süßer" zu machen. Funktionen, die die Ausdruckskraft des Formalismus nicht beeinträchtigen. Gebraucht esp. wenn es eine offensichtliche und triviale Übersetzung des "Zucker" -Features in andere Konstrukte gibt, die bereits in der Notation vorhanden sind. Die a[i]Notation von C ist syntaktischer Zucker für *(a + i). Der Wikipedia-Artikel hat auch eine schöne Erklärung.
Petr Pudlák

3
interessante Dinge , aber kaum zu verwandten let‚s Einführung
wirrbel

2
Es ist eine gut geschriebene Antwort, die jedoch die ursprüngliche Frage nicht beantwortet.
Johan Karlsson

1
@JohanKarlsson Ich behaupte nicht, dass es eine direkte Antwort ist, aber ich denke, dass dies auch für das Thema relevant ist. Insbesondere, warum wurde leteingeführt, als die Frage mit begann Ich habe mich über die Ursprünge des "let"
gewundert

22

Lisp ist die älteste Sprache von diesen, die LET jetzt hat . Aber BASIC war das erste, das es bekam, denn Lisp hatte es viel später erhalten.

In Ada Lovelace Analytical Engine (1843) - no LET sieht ein Programm folgendermaßen aus:

N0 6 N1 1 N2 1 × L1 L0 S1  L0 L2 S0 L2 L0 CB?11 '

In Plankalkül von Zuse (1943-45) sieht das Programm so aus:

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

Short Code wurde 1949 von John Mauchly vorgeschlagen

X3 =  (  X1 +  Y1 )  /  X1 * Y1   

Intermediate PL of Burks, 1950, für die Zuordnung verwendet ->

Rutishauser 1952 benutzt =>=

Böhms-Compiler, 1952, gebraucht ->

An der Universität von Manchester entwickelte sich Alick Glennie Autocodein den frühen 1950er Jahren. Der erste Code und Compiler wurde 1952 für den Mark 1-Computer an der Universität von Manchester entwickelt und gilt als die erste kompilierte Programmiersprache auf hohem Niveau. Wieder ->für die Zuordnung

Charles Adams, FORTRAN 0 von Backus 'Gruppe, Brookers Autocode 2, ПП1 von Lubimsky und Kamynin; alles wieder im Jahr 1954=

BACAIC (Grems, Porter), 1954, *für den Auftrag!

Kompiler, ADES, 1955, =

IT, 1956, <-

Fortran, 1957, =

AT-3 (1956), wieder Math-Matic (1957) = ,

aber Flow-Matic im Jahr 1957 hatte zwei Aufgaben, und beide sind in Worten

TRANSFER a TO b und MOVE a TO b

Bauer und Samelsons Maschine, 1957: =>


Entschuldigung, ich kann nicht alle Sprachen zwischen 1957 und 1964 behandeln, aber größere Sprachen

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)

habe nicht für die Zuordnung LASSEN. Oder nicht , im Falle von LISP.


Dartmouth BASIC ist die Originalversion der Programmiersprache BASIC. Die erste interaktive Version wurde den allgemeinen Nutzern im Juni 1964 zur Verfügung gestellt .

 LET / = — assign formula results to a variable

14

Nun, zwischen diesen drei hatte es Lisp definitiv zuerst. Haskell entstand in den 80ern und Clojure in den 00ern und letwar in der Nähe gewesen lange vor diesen beiden Daten . :-)

Zur Frage , ob Lisp war die Sprache war, die es erfunden hat, kann ich noch nicht bezeugen, aber ich werde ein bisschen recherchieren und nachsehen. :-)

Update: Laut Evolution of Lisp (siehe Seite 46) wurde erwähnt, dass letes in den 70er Jahren erfunden wurde:

LET- selbst ein Makro, das zuerst vor Ort erfunden und neu erfunden wurde - war ein Spätankömmling in der MacLisp-Welt; Laut Lisp Archive wurde es 1979 von Lisp-Machine Lisp gleichzeitig mit DEFMACROder komplexen DEFUNArgument-Syntax von Lisp Machine rückwirkend in PDP-10 MacLisp aufgenommen .

Immer noch nicht ganz beantwortet, ob es früher in einer anderen Sprache erfunden wurde, aber immer noch ein anderer Datenpunkt. :-)


4
ML wurde auch in den 70er Jahren entwickelt, sodass es sein könnte, dass die Idee in dieser Zeit sowohl in ML als auch in Lisp eingeführt wurde.
Giorgio

9

Der erste überarbeitete Schemabericht AIM-452 vom Januar 1978 hat LET. Seite 9.

Beachten Sie, dass Lisp früher ein anderes Konstrukt verwendet hat PROG, um lokale Variablen einzuführen.

(let ((a 1)
      (b 1))
  (+ a b))

wäre früher ungefähr als geschrieben worden

(prog (a b)
  (setq a 1)
  (setq b 1)
  (+ a b))

war letimmer lexikalisch in Lisp Dialekten?
Wirrbel

1
AIM-452 ist der erste überarbeitete Bericht zu Scheme. Der erste Bericht ist AIM-349 aus dem Jahr 1975. Und AIM-848 ist der überarbeitete überarbeitete Bericht. Und der darauffolgende Bericht mit dem Namen "revised ^ 3" (dh der erste, der die Bezeichnung "R ^ nRS" verwendete) war der erste, der kein AIM, sondern eine tatsächliche Sprachspezifikation war. Wenn Sie ein bisschen googeln, finden Sie die PDFs aller dieser Dokumente, damit Sie sie selbst lesen können. Wenn Sie weiter zurückgehen möchten, finden Sie ein altes MacLisp-Handbuch der Software Preservation Group. Vielleicht finden Sie auch einige LISP 1.5-Berichte.
TaylanUB

@wirrbel, es scheint letungefähr so ​​alt wie das lexikalische Scoping zu sein (Schema, '75), und es dauerte eine Weile, bis das lexikalische Scoping Akzeptanz fand, daher würde ich vermuten, dass die ersten Instanzen von letim Kontext von Lisps mit dynamischem Scoping standen. Emacs Lisp verfügt auch heute noch standardmäßig über einen dynamischen Bereich, bei dem lambdaund let(der letztere ohnehin für den ersteren) die Parameter dynamisch gebunden werden.
TaylanUB
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.