Lisp, Clojure ve Haskell'de kullanılan "izin" in kökenlerini merak ediyordum. Önce hangi dilde göründüğünü bilen var mı?
Lisp, Clojure ve Haskell'de kullanılan "izin" in kökenlerini merak ediyordum. Önce hangi dilde göründüğünü bilen var mı?
Yanıtlar:
Eh, TEMEL vardı LETo kullanımını öncesine ait diye, 1964 yılında baştan sözdizimi bir parçası olarak atama için letChris Jester-Young işaret ettiği gibi uygun 1970'lere kadar ortaya çıkmadı ki, Lisp'te Lisp Evrimi .
COBOL, Fortran veya ALGOL'ün de LETsözdiziminde olduğuna inanmıyorum . Bu yüzden BASIC ile gideceğim.
lettemelde sözcüksel olarak kapsamalı bir bağlanma değil. Dolayısıyla, doğru cevap "ilk olarak 12. yüzyıldan önce İngilizce olarak göründü" gibi bir şey olurdu.
letBu bağlamda ( letx isşey ino programlama içine geldiği ilk İngilizce olarak matematiksel metinlerde ortaya şu ifade) ve burası. Biçimsel sistemler arasında bir fark görmüyorum - matematiksel diller, programlama dilleri, başka herhangi bir şey - hepsi aynı.
equalsistemedim is. Ve evet, sözde kod, şu ana kadarki en iyi cevap.
Teorik bir bakış açısı eklemek isterim: Klasik lambda calculi'de letsadece sözdizimsel bir şekerdir. Örneğin
let x = N in M
olduğu gibi yeniden yazılabilir
(λx.M)N
Bu yüzden erken (işlevsel) dillerdeki ilk görünümü o kadar ilginç değil.
Bununla birlikte, Hindley-Milner tipi sistemin icadı ve onun tip çıkarım algoritması ile çok önemli hale geldi . Bu tip sistemde letvazgeçilmezdir, çünkü polimorfiktir (HM'deki ab-soyutlamanın aksine). Örneğin, bu basit ifadeyi göz önünde bulundurun:
let id = λx . x in id id
İşte idpolimorfik, türüne sahip ∀α.α → αve bu nedenle id idtür denetimleri - türü id id : τ → τkeyfi τ içindir. (İlk için idbiz assign τ → τetmek α, ikincisi için idbiz assign τiçin α.)
Ancak λ soyutlama ve uygulama kullanarak tekrar yazamayız. ifade
(λid . id id)(λx.x)
tip-çek vermez, çünkü ilk λ soyutlama içinde idbir monomorfik türü atanmalıdır id : σbazı σ için ve biz geçerli olabilir böyle hiçbir σ yoktur id : σiçin id : σ.
Bunu Haskell'de deneyebilirsiniz. let id = \x -> x in id id :: t -> tYazma kontrolleri yaparken , yazarken (\id -> id id)(\x -> x)başarısız
Kontrol oluşur: sonsuz türünü oluşturamaz:
t0 = t0 -> t0
İlk argümandaid, yaniid
ifadede:id id
İfadesinde:\id -> id id
a[i]gösterimi, sözdizimsel şekerdir *(a + i). Wikipedia makalesinin de güzel bir açıklaması var.
letbireyin tanıtım
letsorusu başlar başlamaz, tanıtılan ile ... Ben "let" nin kökeni hakkında merak
Lisp, şimdi LET'e sahip olanların en eski dilidir . Fakat bunu ilk yapan BASIC oldu, çünkü Lisp daha sonra elde etti.
Ada Lovelace Analitik Motorunda (1843) - LET yok, bir program şöyle görünür:
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
Zuse Plankalkül'de (1943-45) program şöyle görünür:
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
Kısa Kod, 1949'da John Mauchly tarafından önerildi.
X3 = ( X1 + Y1 ) / X1 * Y1
Intermediate PL of Burks, 1950, ödev için kullanılır. ->
1952'de Rutishauser kullanılmış =>=
Böhms derleyicisi, 1952, kullanılmış ->
Manchester Üniversitesi'nde Alick Glennie Autocode, 1950'lerin başında gelişti . İlk kod ve derleyici, 1952'de Manchester Üniversitesi'ndeki Mark 1 bilgisayarı için geliştirildi ve ilk derlenmiş yüksek seviye programlama dili olarak kabul edildi. Yine, ->ödev için
Backus grubunun FORTRAN 0'ından Charles Adams, Brooker's Autocode 2, Lubimsky ve Kamynin'den ПП1; hepsi 1954’te tekrar=
BACAIC (Grems, Porter), 1954, *ödev için!
Kompiler, ADES, 1955, =
Bilişim, 1956, <-
FORTRAN, 1957, =
AT-3 (1956), Math-Matic (1957), yine =,
ancak 1957’deki Flow-Matic’in iki görevi vardı ve her ikisi de kelimelerdeydi
TRANSFER a TO b ve MOVE a TO b
Bauer ve Samelson'ın makinesi, 1957: =>
Maalesef 1957 ve 1964 arasındaki tüm dilleri kapsayamıyorum, ancak daha büyük dilleri
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)
atamak için LET almamış. LISP durumunda da yoktu .
Dartmouth BASIC , BASIC programlama dilinin orijinal sürümüdür. İlk interaktif versiyon Haziran 1964’te genel kullanıcılara sunuldu ;
LET / = — assign formula results to a variable
Eh, bu üç arasında, Lisp kesinlikle önce sahipti. Haskell 80'lerde, Clojure 00'larda ortaya çıktı ve bu tarihlerden herhangi birinden çok önce letvardı . :-)
Lisp'in onu icat eden dil olup olmadığına gelince, bunun için henüz kefil olamıyorum ama biraz araştırma yapacağım ve göreceğim. :-)
Güncelleme: Lisp'in Evrimine göre (bkz. Sayfa 46), let70'lerde icat edildiğinden bahsetti :
LET- önce her sitede yerel olarak icat edilen ve yeniden icat eden bir makro - MacLisp dünyasının son zamanlarıydı; Lisp Arşivi'ne göre, 1979'da Lisp-Machine Lisp'ten PDP-10 MacLisp'eDEFMACROve karmaşık Lisp MachineDEFUNargüman sözdizimi ile aynı anda geriye dönük olarak absorbe edildi .
Elbette daha önce başka bir dilde icat edilip edilmediğine henüz cevap vermedi elbette, ama yine de başka bir veri noktası. :-)
İlk Revize Edilmiş Şema raporu Ocak 1978'den AIM-452'ye sahiptir LET. Sayfa 9.
Lisp'in daha önce PROGyerel değişkenleri tanıtmak için farklı bir yapı kullandığını unutmayın .
(let ((a 1)
(b 1))
(+ a b))
yaklaşık olarak önceden yazılmış
(prog (a b)
(setq a 1)
(setq b 1)
(+ a b))
lethep lexically Lisp lehçelerinde kapsamlı?
letsözcüksel kapsamlaştırma kadar eski (Scheme, '75) ve sözcüksel kapsamlamanın kabul görmesi biraz zaman aldı, bu yüzden ilk örneklerinin letdinamik olarak kapsamda olan Lisps bağlamında olduğunu tahmin ediyorum. Bugün, Emacs Lisp hala varsayılan olarak dinamik kapsamını sahiptir lambdave letdinamik parametrelerini bağlayıcı (eski için yine de ikinci şeker).