나는 Lisp, Clojure 및 Haskell에서 사용 된 "let"의 기원에 대해 궁금해하고있었습니다. 누구가 처음에 어떤 언어를 사용했는지 알고 있습니까?
나는 Lisp, Clojure 및 Haskell에서 사용 된 "let"의 기원에 대해 궁금해하고있었습니다. 누구가 처음에 어떤 언어를 사용했는지 알고 있습니까?
답변:
음, 기본이 있었다 LET
즉의 사용을 앞선 것이다, 그래서 1964 년 시작부터 구문의 일부로서 지정을 위해 let
크리스 광대 - 영 지적대로에 따라 1970 년대까지 나타나지 않았다, 리스프에서 리스프의 진화 .
COBOL, Fortran 또는 ALGOL도 LET
구문에 있다고 생각하지 않습니다 . 저는 BASIC과 함께 갈 것입니다.
let
. 기본적으로 어휘 범위 바인딩이 아닙니다. 따라서 정답은 "12 세기 이전에 영어로 처음 나온 것"과 같습니다.
let
이러한 맥락 (에 let
X의 is
뭔가 in
가 프로그램에 출처 첫번째 영어 수학 교과서에 나타난 다음과 같은 표현)이있다. 공식 시스템 (수학적 언어, 프로그래밍 언어 등)의 차이점은 전혀 없습니다.
equals
하지 is
. 그리고 지금까지 의사 코드가 가장 좋은 답입니다.
이론적 인 관점을 추가하고 싶습니다. 고전적인 람다 계산법에서는 let
단지 구문 설탕입니다. 예를 들어
let x = N in M
간단하게 다시 쓸 수 있습니다
(λx.M)N
따라서 초기 (기능적) 언어로 처음 등장한 것은 그리 흥미롭지 않습니다.
그러나 Hindley-Milner 타입 시스템과 타입 추론 알고리즘 이 발명되면서 매우 중요해 졌습니다. 이 유형의 시스템 let
은 다형성이기 때문에 필수 불가결합니다 (HM의 λ-abstraction과 달리). 예를 들어 다음과 같은 간단한 표현을 생각해보십시오.
let id = λx . x in id id
여기 id
에 다형성이 있고 type이 ∀α.α → α
있으므로 id id
type- id id : τ → τ
checks-임의의 τ에 대한 유형입니다 . (첫 번째에 대한 id
우리의 할당 τ → τ
에 α
두 번째에 대한 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
a[i]
표기법은에 대한 구문 설탕입니다 *(a + i)
. Wikipedia 기사 에도 좋은 설명이 있습니다.
let
소개 와 거의 관련이 없음
let
리스프는 지금 LET이있는 가장 오래된 언어입니다 . 그러나 Lisp가 그것을 훨씬 나중에 얻었 기 때문에 BASIC은 그것을 얻은 첫 번째 제품이었습니다.
Ada Lovelace Analytical Engine (1843)-LET이 없으면 프로그램은 다음과 같습니다.
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
Zuse의 Plankalkül (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 년 John Mauchly에 의해 제안되었습니다.
X3 = ( X1 + Y1 ) / X1 * Y1
1950 년 Burks의 중간 PL ->
1952 년 Rutishauser 사용 =>=
Böhms 컴파일러 (1952) ->
맨체스터 대학교에서 Alick Glennie는 Autocode
1950 년대 초에 개발 되었습니다. 첫 번째 코드 및 컴파일러는 1952 년 맨체스터 대학교의 Mark 1 컴퓨터 용으로 개발되었으며 최초의 컴파일 된 고급 프로그래밍 언어로 간주됩니다. 다시 ->
할당
Charles Adams, Backus 그룹의 FORTRAN 0, Brooker 's Autocode 2, Lubimsky의 ПП1 및 Kamynin; 다시 1954 년=
1954 년 BACAIC (Grems, Porter), *
배정!
1955 년 ADES Kompiler =
1956 년 IT <-
포트란, 1957 =
AT-3 (1956), Math-Matic (1957), 다시 =
,
1957 년 Flow-Matic에는 두 가지 과제가있었습니다.
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
글쎄, 그 세 가지 사이에서, Lisp는 분명히 그것을 먼저 가지고있었습니다. Haskell은 80 년대에, Clojure는 00 년대에 let
왔으며 , 그 어느 날짜보다 오래 전에 사용 되었습니다 . :-)
Lisp가 그것을 개발 한 언어 인지에 관해서 는 아직 그것을 보증 할 수는 없지만 조사하고 볼 것입니다. :-)
업데이트 : Lisp의 진화 (46 페이지 참조) let
에 따르면 70 년대에 발명 되었다고 언급했습니다 .
LET
그 자체가 각 사이트에서 처음으로 로컬에서 발명되고 재창조 된 매크로는 MacLisp 세계의 후발주였습니다. Lisp Archive에 따르면 1979 년DEFMACRO
Lisp MachineDEFUN
인수 구문 과 동시에 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))
let
항상 어휘 리스프 방언의 범위?
let
어휘 범위 (Scheme, '75)만큼 오래 된 것으로 보이며 어휘 범위가 수용되기까지 시간이 걸렸으므로 첫 번째 인스턴스 let
는 동적 범위 Lisps의 맥락에 있다고 생각합니다 . 오늘날 Emacs Lisp는 기본적으로 여전히 동적 범위를 가지고 있으며 lambda
, let
(과 후자의 설탕은) 매개 변수를 동적으로 바인딩합니다.