W jakim języku programowania pojawiło się słowo „pozwól”?

24

Zastanawiałem się, skąd pochodzi słowo „let” używane w Lisp, Clojure i Haskell. Czy ktoś wie, w jakim języku się pojawił?

carinmeier
źródło
Asembler używa MOV zamiast LET z 1954 roku. Czy to nie wystarczy?
Gangnus
1
LISP jest wystarczająco duży, aby być dobrym kandydatem.
mouviciel
2
na dowolne pytanie „W jakim języku programowania pojawił się X” seplenienie jest dość dobrym przypuszczeniem prawidłowej odpowiedzi
Zachary K
2
niech pochodzenie pochodzi z matematyki, a nie z innych języków programowania.
Pieter B,
Przyjmujesz błędne założenie, że pierwsze użycie „let” w języku programowania jest początkiem użycia „let” w Lisp, Clojure i Haskell.
Pieter B,

Odpowiedzi:

41

Cóż, BASIC miał LETdo przydzielenia jako część składni od samego początku w 1964 roku, więc to byłoby wcześniejsze niż użycie letw Lisp, które, jak podkreśla Chris Jester-Young, pojawiło się dopiero w 1970 roku, według Evolution of Lisp .

Nie wierzę też, że COBOL, Fortran lub ALGOL mają LETswoją składnię. Więc idę z BASIC.

Greg
źródło
11
Ale semantyka jest zupełnie inna - letw zasadzie nie jest powiązaniem o zasięgu leksykalnym. Prawidłowa odpowiedź brzmiałaby więc tak: „po raz pierwszy pojawiła się w języku angielskim przed XII wiekiem”.
SK-logika
12
Ale pytanie brzmi: w jakim języku programowania pojawiło się słowo „let”? Tak naprawdę nie uważam angielskiego za język programowania (przynajmniej w tym kontekście).
Greg
7
letw tym kontekście ( letx iscoś inw poniższym wyrażeniu) po raz pierwszy pojawił się w tekstach matematycznych w języku angielskim i tutaj przyszedł do programowania. Nie widzę różnicy między systemami formalnymi - językami matematycznymi, językami programowania, czymkolwiek innym - wszystkie są takie same.
SK-logika
3
„niech x wynosi 3” nie jest prawidłową gramatyką. Nigdy nie zobaczysz tego w żadnym angielskim podręczniku. Masz niewłaściwy czasownik „być”. Powinno to być „niech x będzie 3” lub „niech x równa się 3”. Tak czy inaczej, semantyka czy nie, autor pytania pytał o język programowania. Więc jeśli nie znasz komputera, który przyjmuje instrukcje w języku angielskim poprzedzające BASIC, nie kupuję go. W przeciwnym razie moglibyśmy właśnie odpowiedzieć na „kod psuedo” i byłoby to prawidłowe, ale nie uszanowałoby ducha jej pytania.
Greg,
1
oczywiście użyłem notacji ML i miałem na myśli equals, że nie is. I tak, pseudo-kod jest jak dotąd najlepszą odpowiedzią.
SK-logika
30

Chciałbym dodać teoretyczny punkt widzenia: w klasycznych obliczeniach lambda letjest po prostu cukrem syntaktycznym. Na przykład

let x = N in M

można przepisać po prostu jako

(λx.M)N

Więc jego pierwsze pojawienie się we wczesnych (funkcjonalnych) językach nie jest tak interesujące.

Jednak stało się to bardzo ważne wraz z wynalezieniem systemu typu Hindley-Milner i jego algorytmem wnioskowania typu. W tym typie system letjest niezbędny, ponieważ jest polimorficzny (w przeciwieństwie do λ-abstrakcji w HM). Rozważmy na przykład to proste wyrażenie:

let id = λx . x in id id

Tutaj idjest polimorficzny, ma typ ∀α.α → α, a zatem id idsprawdza typ - jest typem id id : τ → τdla dowolnego τ. (Na pierwszym idprzypisujemy τ → τdo αi dla drugiego idprzypiszemy τdo α).

Nie możemy go jednak przepisać przy użyciu abstrakcji i aplikacji λ. Wyrażenie

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

nie typ-czek, bo w pierwszym X abstrakcji idmusi być przypisany jednokształtnym rodzaj id : σjakiegoś Ď, a nie ma σ takie, że możemy zastosować id : σdo id : σ.

Możesz tego spróbować w Haskell. Podczas let id = \x -> x in id id :: t -> tsprawdzania typu pisanie (\id -> id id)(\x -> x)kończy się niepowodzeniem

Występuje sprawdzenie: nie można skonstruować typu nieskończonego: t0 = t0 -> t0
W pierwszym argumencie id, mianowicie id
W wyrażeniu: id id
W wyrażeniu:\id -> id id

Petr Pudlák
źródło
+1 za bardzo interesującą odpowiedź. Na marginesie, jeśli go znasz, możesz zamieścić (w komentarzu, ponieważ nie jest to związane z głównym pytaniem) odniesienie do ścisłej definicji „cukru syntaktycznego”.
Giorgio
3
@Giorgio Cytując słownik nowego hakera : Funkcje dodane do języka lub innego formalizmu, aby uczynić go „słodszym” dla ludzi, cechy, które nie wpływają na ekspresję formalizmu. Używane esp. gdy istnieje oczywiste i trywialne tłumaczenie cechy „cukru” na inne konstrukty już obecne w notacji. a[i]Notacja C to cukier syntaktyczny *(a + i). Artykuł w Wikipedii ma również dobre wyjaśnienie.
Petr Pudlák
3
ciekawe rzeczy, ale mało związane z letwprowadzeniem
wirrbel,
2
Jest to dobrze napisana odpowiedź, ale nie odpowiada na pierwotne pytanie.
Johan Karlsson
1
@JohanKarlsson Nie twierdzę, że jest to bezpośrednia odpowiedź, ale myślę, że dotyczy to również tematu. W szczególności dlaczego został letwprowadzony, ponieważ pytanie zaczyna się od zastanawiania się nad początkami „let” ...
Petr Pudlák
22

Lisp jest najstarszym językiem tych mającego LET teraz . Ale BASIC był pierwszym, który go otrzymał, ponieważ Lisp uzyskał go znacznie później.

W Ada Lovelace Analytical Engine (1843) - brak LET, program wygląda następująco:

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

W Plankalkül of Zuse (1943-45) program wygląda następująco:

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

Krótki kod został zaproponowany przez Johna Mauchly'ego w 1949 roku

X3 =  (  X1 +  Y1 )  /  X1 * Y1   

Pośredni PL of Burks, 1950, wykorzystany do zadania ->

Używany Rutishauser w 1952 roku =>=

Używany kompilator Böhm, 1952 ->

Na uniwersytecie w Manchesterze Alick Glennie rozwinął się Autocodena początku lat pięćdziesiątych. Pierwszy kod i kompilator został opracowany w 1952 roku dla komputera Mark 1 na University of Manchester i jest uważany za pierwszy skompilowany język programowania wysokiego poziomu. Ponownie, ->do zadania

Charles Adams, FORTRAN 0 z grupy Backusa, Autokod 2 Brookera, ПП1 Lubimskiego i Kamynina; znowu w 1954 roku=

BACAIC (Grems, Porter), 1954, *za zadanie!

Kompiler, ADES, 1955, =

IT, 1956, <-

FORTRAN, 1957 r., =

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

ale Flow-Matic w 1957 r. miał dwa zadania i oba są słowne

TRANSFER a TO b i MOVE a TO b

Maszyna Bauera i Samelsona, 1957: =>


Niestety, nie mogę objąć wszystkich języków między 1957 a 1964 rokiem, ale większych języków

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)

nie LET dla zadania. Lub nie , w przypadku LISP.


Dartmouth BASIC to oryginalna wersja języka programowania BASIC. Pierwsza interaktywna wersja została udostępniona ogólnym użytkownikom w czerwcu 1964 r . ;

 LET / = — assign formula results to a variable
Gangnus
źródło
14

Pomiędzy tymi trzema Lisp zdecydowanie miał go pierwszy. Haskell powstał w latach osiemdziesiątych, a Clojure w latach dziewięćdziesiątych i letbył na długo przed którąkolwiek z tych dat. :-)

Czy Lisp był język wymyślili go, nie mogę ręczyć za to jeszcze, ale będę robić jakieś badania i zobaczymy. :-)

Aktualizacja: Według Evolution of Lisp (patrz strona 46) wspomniała, że letzostała wynaleziona w latach 70-tych:

LET- samo makro wymyślone i wymyślone lokalnie w każdym miejscu - spóźniło się ze światem MacLisp; Według Archiwum Lisp został on wstecznie zaabsorbowany do PDP-10 MacLisp z Lisp-Machine Lisp w 1979 roku w tym samym czasie co DEFMACROzłożona DEFUNskładnia argumentów Lisp Machine .

Nadal nie do końca odpowiada, czy został wcześniej wynaleziony w innym języku, ale wciąż inny punkt danych. :-)

Chris Jester-Young
źródło
4
ML został również opracowany w latach 70., więc być może pomysł został wprowadzony zarówno w ML, jak i Lisp w tym okresie.
Giorgio,
9

Pierwszy raport zmienionego programu AIM-452 ze stycznia 1978 r LET. Ma . Strona 9.

zauważ, że Lisp użył wcześniej innej konstrukcji PROGdo wprowadzenia zmiennych lokalnych.

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

zostałby napisany wcześniej mniej więcej jako

(prog (a b)
  (setq a 1)
  (setq b 1)
  (+ a b))
Rainer Joswig
źródło
letzawsze był w zakresie dialektu Lisp w zakresie leksykalnym?
wirrbel,
1
AIM-452 to pierwszy poprawiony raport na temat programu. Pierwszym raportem jest AIM-349 z 1975 r. A AIM-848 to poprawiony poprawiony raport. A następny, zwany raportem „poprawiona ^ 3” (tj. Pierwszy, który używał nazewnictwa „R ^ nRS”) był pierwszym, który nie był AIM, ale rzeczywistą specyfikacją języka. Google przeglądając trochę, znajdziesz pliki PDF wszystkich tych dokumentów, dzięki czemu możesz je przeczytać samodzielnie. Jeśli chcesz cofnąć się o krok wstecz, możesz znaleźć starą instrukcję MacLisp z grupy Software Preservation Group, a być może uda ci się również znaleźć raporty LISP 1.5.
TaylanUB,
@wirrbel, wydaje się, że letjest prawie tak stary, jak zakres leksykalny (Scheme, '75), i zajęło trochę czasu, zanim zakres zakresu leksykalnego zyskał akceptację, więc zgaduję, że pierwsze przypadki letbyły w kontekście dynamicznie skalowanego Lispsa. Dzisiaj Emacs Lisp nadal ma domyślnie zakres dynamiczny, a lambdai let(ten drugi cukier dla tych pierwszych i tak) wiążą ich parametry dynamicznie.
TaylanUB,