과제(컴퓨터 과학)
Assignment (computer science)컴퓨터 프로그래밍에서 할당문은 변수명으로 나타나는 기억위치에 기억된 값을 설정 및/또는 재설정한다.즉, 값을 변수에 복사한다.대부분의 명령형 프로그래밍 언어에서 할당문(또는 표현식)은 기본 구조입니다.
현재 이 작업에 가장 일반적으로 사용되는 표기법은 다음과 같습니다.x = expr
(원래 Superplan 1949-51년, Fortran 1957 및 C에 의해 대중화되었습니다.)두 번째로 일반적으로 사용되는 표기법은[1] x := expr
(원래는 Pascal에 의해 [2]보급된 ALGOL 1958).다른 많은 표기법도 사용되고 있습니다.일부 언어에서는 사용되는 기호가 연산자로 간주됩니다(즉, 할당문이 전체적으로 값을 반환하는 것을 의미합니다).다른 언어에서는 할당을 스테이트먼트(식에서는 사용할 수 없음을 의미)로 정의합니다.
일반적으로 할당을 통해 변수는 수명 및 범위 동안 서로 다른 시간에 다른 값을 유지할 수 있습니다.단, 일부 언어(주로 엄밀하게 기능하는 언어)에서는 비로컬 상태의 변경을 의미할 수 있기 때문에 이러한 종류의 "파괴적인" 재할당을 허용하지 않습니다.그 목적은 참조 투명성, 즉 일부 변수의 상태에 의존하지 않지만 주어진 파라메트릭 입력 집합에 대해 동일한 결과를 생성하는 기능을 시행하는 것이다.다른 언어의 최신 프로그램도 복잡함을 줄이기 위해 일반적으로 데이터 구조화, 구조화 프로그래밍 및 객체 방향과 같은 보완적인 방법론과 함께 덜 엄격하지만 특정 부분에서만 유사한 전략을 사용하는 경우가 많습니다.
의미론
할당 연산은 명령형 프로그래밍의 프로세스로,[1] 시간이 지남에 따라 다른 값이 특정 변수 이름과 관련지어집니다.이러한 모델에서 프로그램은 연속된 할당 [2][3]문을 사용하여 상태를 변경함으로써 작동합니다.명령형 프로그래밍 언어의 기본 요소는 [4]반복을 수행하는 할당에 의존합니다.가장 낮은 수준에서 할당은 다음과 같은 기계 조작을 사용하여 구현됩니다.MOVE
또는STORE
를 클릭합니다.[2][4]
변수는 값의 컨테이너입니다.변수에 값을 넣고 나중에 새 값으로 바꿀 수 있습니다.할당 조작은 실행 프로그램의 [3]현재 상태를 변경한다.따라서 할당은 변수의 개념에 따라 달라집니다.과제:
- 그
expression
프로그램의 현재 상태에서 평가됩니다. - 그
variable
계산된 값이 할당되어 해당 변수의 이전 값이 대체됩니다.
예:라고 가정하면a
할당은 숫자 변수입니다.a := 2*a
변수의 내용이a
스테이트먼트의 실행 후에 2배가 됩니다.
C 코드의 세그먼트 예:
인트 x = 10; 흘러가다 y; x = 23; y = 32.4도;
이 예제에서 변수는x
처음에 int로 선언되고 다음으로 값 10이 할당됩니다.선언과 할당은 같은 스테이트먼트에서 이루어집니다.두 번째 줄에y
는 할당 없이 선언됩니다.세 번째 줄에는x
값 23이 재할당됩니다.마침내.y
에 32.4의 값이 할당됩니다.
할당 조작의 경우는, 다음의 값이 필요하게 됩니다.expression
정의되어 있습니다(유효한 r값입니다).variable
는 변경 가능한 엔티티를 나타냅니다(유효한 변경 가능(비정수) l값).일부 언어(일반적으로 동적 언어)에서는 변수를 값을 할당하기 전에 선언할 필요가 없습니다.이러한 언어에서는 변수가 처음 할당될 때 자동으로 선언되며 선언된 범위는 언어에 따라 달라집니다.
단일 할당
기존 값을 변경하는 할당(예:x := x + 1
)는 기능적인 [4]언어에서만 사용할 수 있습니다.기능 프로그래밍에서는 할당이 단일 할당(초기화라고도 함)을 선호하기 위해 권장되지 않습니다.단일 할당은 이름 바인딩의 한 가지 예입니다.이 문서에서 설명한 할당과는 다릅니다.일반적으로 변수가 생성되었을 때 한 번만 실행할 수 있으며 이후 재할당은 허용되지 않습니다.
식의 평가는 기계의 [5]관측 가능한 상태를 변경하지 않고 동일한 [4]입력에 대해 동일한 값을 생성하는 경우 부작용을 일으키지 않습니다.필수 할당은 새로운 값으로 [6]대체하면서 오래된 값을 파괴하고 사용할 수 없게 만들면서 부작용을 일으킬 수 있으며, 이러한 이유로 LISP 및 함수 프로그래밍에서는 파괴적 업데이트와 같이 파괴적 할당이라고 합니다.
단일 할당은 Haskell과 같이 순전히 기능적인 언어에서 사용할 수 있는 유일한 할당 형식입니다. 이 언어에는 명령형 프로그래밍[4] 언어의 의미에서의 변수가 없으며, 오히려 복합 성질의 상수 값이라는 이름을 붙일 수 있는 요소가 온 디맨드로 점진적으로 정의됩니다.순수하게 기능적인 언어는 값이 서로 [7]독립적이기 때문에 한번에 한 단계씩 순차적으로 실행되는 von Neumann 병목 현상을 피하면서 병렬로 연산할 수 있는 기회를 제공할 수 있다.
불순한 함수 언어는 단일 할당과 진정한 할당을 모두 제공합니다(단, 진정한 할당은 일반적으로 필수 프로그래밍 언어보다 더 적은 빈도로 사용됩니다).예를 들어 Scheme에서는 둘 다 단일 할당입니다.let
(을 포함) 및 진정한 할당set!
)는 모든 변수에 사용할 수 있으며 목록, 벡터, 문자열 등의 파괴적인 업데이트를 위해 특수 프리미티브가 제공됩니다.OCaml에서는 변수 할당이1개만 허용되며let name = value
구문. 단, 파괴적인 갱신은 별도의 배열 및 문자열 요소에서 사용할 수 있습니다.<-
연산자 및 프로그래머에 의해 명시적으로 가변(초기 선언 후 변경될 수 있음을 의미)으로 선언된 레코드 및 객체의 필드.
단일 할당을 사용하는 함수형 프로그래밍 언어에는 Clojure(var가 아닌 데이터 구조의 경우), Erlang(Haskell과 대조적으로 값이 동일한 경우 다중 할당을 허용), F#, Haskell, JavaScript(상수의 경우), Lava, OCaml, Oz(셀이 아닌 데이터 흐름 변수의 경우), Racket(일부 구조 목록의 경우) 등이 있습니다.SASL, Scala(vals의 경우), SISAL, Standard ML. 비백트래킹 Prolog 코드는 명시적인 단일 할당으로 간주할 수 있으며 (이름 있는) 변수가 명시적으로 할당되지 않은 상태이거나 정확히 한 번 설정할 수 있습니다.반면 Haskell에서는 할당되지 않은 변수가 있을 수 없으며, 모든 변수는 생성 시 해당 값(또는 필요에 따라 값을 생성하는 계산 개체)에 암묵적으로 설정된 것으로 간주할 수 있습니다.
할당값
일부 프로그래밍 언어에서는 할당문이 값을 반환하는 반면 다른 언어에서는 반환되지 않습니다.
대부분의 표현 지향 프로그래밍 언어(예: C)에서 할당문은 할당된 값을 반환하고 다음과 같은 관용구를 허용합니다.x = y = a
assignment 스테이트먼트가 있는 경우y = a
값을 반환합니다.a
다음으로 에 할당됩니다.x
. 다음과 같은 문장에서while ((ch = getchar()) != EOF) {…}
함수의 반환값은 변수에 동일한 값을 할당하면서 루프를 제어하기 위해 사용됩니다.
예를 들어 Scheme와 같은 다른 프로그래밍 언어에서는 할당의 반환값이 정의되어 있지 않으며 이러한 관용구는 유효하지 않습니다.
Haskell에서는 [8]변수 할당은 없지만 할당과 유사한 작업(어레이 필드 또는 가변 데이터 구조의 필드 할당 등)은 보통 다음과 같이 유닛 유형에 대해 평가됩니다.()
이 타입에는 1개의 값밖에 없기 때문에 정보가 포함되어 있지 않습니다.이는 일반적으로 순전히 부작용 때문에 평가되는 표현의 유형입니다.
다양한 형태의 할당
특정 사용 패턴은 매우 일반적이기 때문에 이를 지원하기 위한 특별한 구문을 사용하는 경우가 많습니다.이것들은 주로 소스 코드의 중복성을 줄이기 위한 구문설탕이지만, 프로그래머의 의도를 이해하는 데 있어서 코드의 독자를 돕고 컴파일러에게 가능한 최적화의 실마리를 제공한다.
확장 할당
할당된 값이 이전 값에 의존하는 경우는 너무 일반적이기 때문에 많은 명령어, 특히 C와 그 후손의 대부분은 증강 할당이라고 불리는 특별한 연산자를 제공합니다.*=
,그렇게a = 2*a
대신 이라고 쓸 수 있다a *= 2
구문설탕을 넘어 변수의 내부 수정을 명확히 함으로써 컴파일러의 작업을 지원합니다.[3]a
가능합니다.
연쇄 할당
다음과 같은 진술w = x = y = z
연쇄 연결이라고 불리며, 이 연결의 값은z
여러 변수에 할당되어 있습니다.w, x,
그리고.y
연쇄 할당은 에서와 같이 여러 변수를 초기화하기 위해 자주 사용됩니다.
a = b = c = d = f = 0
모든 프로그래밍 언어가 체인 할당을 지원하는 것은 아닙니다.연쇄 할당은 일련의 할당과 동일하지만 평가 전략은 언어에 따라 다릅니다.여러 변수를 초기화하는 것과 같은 단순 연쇄 할당의 경우 평가 전략은 중요하지 않지만 할당의 대상(l-값)이 어떤 방식으로 연결되어 있으면 평가 전략이 결과에 영향을 미칩니다.
일부 프로그래밍 언어(C 등)에서는 할당이 식이고 값이 있기 때문에 체인 할당이 지원됩니다.이 경우 체인 할당은 오른쪽에서 왼쪽으로 할당함으로써 구현할 수 있습니다.예를들면,i = arr[i] = f()
와 동등하다arr[i] = f(); i = arr[i]
C++에서는 할당 연산자의 적절한 반환 유형을 선언함으로써 클래스 유형 값에도 사용할 수 있습니다.
Python에서 assignment 문은 식이 아니므로 값이 없습니다.대신 체인 할당은 단일 식에 대해 여러 대상이 있는 일련의 문입니다.할당은 왼쪽에서 오른쪽으로 실행되므로i = arr[i] = f()
식을 평가하다f()
그런 다음 가장 왼쪽 타겟에 결과를 할당합니다.i
같은 결과를 다음 타깃에 할당합니다.arr[i]
의 새로운 값을 사용하여i
이는 기본적으로 다음과 같습니다.[9]tmp = f(); i = tmp; arr[i] = tmp
그러나 임시 값에 대한 실제 변수는 생성되지 않습니다.
병렬 할당
APL, Common Lisp,[10] Go,[11] JavaScript(1.7 이후), PHP, Maple, Lua, [12]occam 2,[13] Perl,[14] Python, REBOL, [15]Ruby, PowerShell과 같은 일부 프로그래밍 언어는 다음과 같은 구문과 함께 여러 변수를 병렬로 할당할 수 있습니다.
a, b : = 0, 1
동시에 0이 할당됩니다.a
및 1 ~b
이는 병렬 할당으로 가장 많이 알려져 있습니다. 1963년에 CPL에서 동시 [16]할당이라는 이름으로 도입되었습니다.다만, 「단일 할당」과 함께 사용하면, 이러한 할당은 서로 반대되는 것이 아니기 때문에 혼란스럽지만, 경우에 따라서는 복수 할당이라고 불리기도 합니다.할당의 오른쪽이 단일 변수(예: 배열 또는 구조)인 경우 이 기능을 할당 [18]언패킹 또는 파괴라고 합니다[17].
var list:= {0, 1) a, b:= 목록
리스트가 압축 해제되어 0이 할당됩니다.a
및 1 ~b
.더 나아가,
a, b:= b, a
가치를 교환하다a
그리고.b
병렬 할당이 없는 언어에서는 임시 변수를 사용하려면 이 항목을 작성해야 합니다.
var t : = a : = b : = t
부터a := b; b := a
둘 다 남기다a
그리고.b
본래의 가치를 가지고b
.
Go 및 Python과 같은 일부 언어는 병렬 할당, 튜플 및 자동 태플 언팩을 결합하여 이 Python 예시와 같이 단일 함수에서 여러 개의 반환 값을 허용합니다.
. 그렇지만 f(): 돌아가다 1, 2 a, b = f()
여기에 표시된 C#이나 Rust 등의 다른 언어에는 명시적인 태플 구축과 괄호를 사용한 디커버리먼트가 필요합니다.
// 유효한 C# 또는 Rust 구문 (a, b) = (b, a);
// C# 태플 리턴 (스트링, 인트) f() => ("푸", 1); 변화하다 (a, b) = f();
// 러스트 태플 리턴 허락하다 f = ("푸", 1); 허락하다 (a, b) = f();
이는 함수에서 여러 값을 반환하기 위해 출력 파라미터를 사용하는 대신 사용할 수 있습니다.이는 CLU(1974년)로 거슬러 올라가며, CLU는 일반적으로 병렬 할당의 대중화에 기여하였다.
또한 C#은 컴파일러가 적절한 인스턴스 또는 확장을 검색할 때 오른쪽 식에 의해 정의된 구현을 통해 일반적인 디구축 할당을 허용합니다. Deconstruct
method를 지정합니다.이 [19]메서드는 할당할 변수에 대한 출력 파라미터를 가져야 합니다.예를 들어, 클래스에 그것을 제공하는 메서드 중 하나가 반환값과 동일한 동작으로 나타납니다.f()
상기의 경우
무효 디컨스트럭트(나가. 스트링 a, 나가. 인트 b) { a = "푸"; b = 1; }
C 및 C++에서 콤마 연산자는 병렬 할당과 유사하며, 단일 스테이트먼트 내에서 여러 개의 할당을 수행할 수 있습니다.a = 1, b = 2
대신a, b = 1, 2
이것은 주로 루프에 사용되며 [20]Go 등의 다른 언어에서 병렬 할당으로 대체됩니다.단, 위의 C++ 코드는 다음 코드의 우측에 있기 때문에 완전한 동시화가 보장되지 않습니다.a = b, b = a+1
왼쪽 뒤에 평가됩니다.Python과 같은 언어에서는a, b = b, a+1
는 2개의 변수를 동시에 할당하고 a의 초기값을 사용하여 새로운 b를 계산합니다.
할당 대 평등
등호 사용=
평등에 대한 비교로서 평등과의 충돌로 인해 할당 연산자는 자주 비판을 받아왔다.이것은 코드 작성에 있어서 초심자에 의한 혼란과 코드 읽기에 있어서 경험이 풍부한 프로그래머에 의한 혼란으로 이어집니다.할당에 동등어를 사용한 것은 1949년부터 1951년까지 설계된 하인즈 루티샤 유저의 언어 Superplan으로 거슬러 올라가며 Fortran에 의해 특히 대중화되었습니다.
나쁜 아이디어의 악명 높은 예는 과제를 나타내는 등호 선택이다.1957년[a] Fortran으로 거슬러 올라가며 언어 디자이너들의 무턱대고 베꼈다.왜 안 좋은 생각일까요?"="가 참과 거짓의 술어인 평등을 비교하는 것을 의미하게 하는 것은 한 세기의 전통을 뒤엎는 것이기 때문이다.하지만 Fortran은 평등을 강요하는 임무를 의미했습니다.이 경우 오퍼랜드는 부등위치에 있습니다.왼쪽 피연산자(변수)는 오른쪽 피연산자(식)와 같아야 합니다.x = y는 y = [21]x와 같은 것을 의미하지 않습니다.
--
초보 프로그래머는 수학에서 "="는 동등함을 의미하고 많은 언어에서 할당에 사용되기 때문에 때때로 할당과 동등성을 위한 관계 연산자를 혼동한다.그러나 할당은 변수의 값을 변경하는 반면 동등성 검정에서는 두 식의 값이 동일한지 여부를 테스트합니다.
BASIC 등의 일부 언어에서는 단일 등호("="
)는 할당 연산자와 등가 관계 연산자 양쪽에 사용되며 어떤 것이 의미되는지 컨텍스트가 결정합니다.다른 언어에서는 두 연산자에 대해 서로 다른 기호를 사용합니다.예를 들어 다음과 같습니다.
- ALGOL 및 Pascal에서 할당 연산자는 콜론과 등호(
":="
등호 연산자는 단일 등호("="
). - C에서 할당 연산자는 단일 등호(
"="
등호 연산자는 등호 쌍입니다( )입니다."=="
). - R에서 할당 연산자는 기본적으로
<-
와 같이x <- value
단, 특정 컨텍스트에서는 등호 1개를 사용할 수 있습니다.
두 기호의 유사성으로 인해 프로그래머가 어떤 형태("")를 잊어버린 경우 오류가 발생할 수 있습니다.=
", "==
", ":=
")가 적절하거나 잘못 입력된 경우=
"일 때"==
"를 의도했다.이는 C와 같은 언어(Linux [22]커널 백도어 시도 포함)에서 흔히 볼 수 있는 프로그래밍 문제입니다.할당 연산자는 할당된 값도 반환합니다(함수가 값을 반환하는 것과 같은 방식으로). 식 내에 유효하게 중첩될 수 있습니다.두 값을 비교하는 것이 목적이라면if
예를 들어, 할당은 Boolean true로 해석 가능한 값을 반환할 가능성이 매우 높습니다.이 경우, 이 경우,then
절이 실행되어 프로그램이 예기치 않게 동작합니다.일부 언어 프로세서(gcc 등)는 이러한 상황을 검출하여 프로그래머에게 잠재적인 오류를 경고할 수 있습니다.
표기법
복사 할당의 가장 일반적인 두 가지 표현은 등호입니다.=
및 대장염(:=
두 형식 모두 언어 및/또는 사용법에 따라 의미론적으로 할당문 또는 할당 연산자(값도 있음) 중 하나를 나타낼 수 있습니다.
variable = expression
Fortran, PL/I, C(및 C++, Java 등의 하위), Bourne 쉘, Python, Go(사전 선언된 변수에 할당), R, PowerShell, Nim 등 variable := expression
ALGOL(및 파생 모델), Simula, CPL, BCPL[23], Pascal(및 Modula와 같은 하위 모델), Mary, PL/M, Ada, Smalltalk, [24][25]Eiffel, Oberon, [26]Dylan, Seed7, Python(할당 [27]표현식), Go([28]변수 선언 및 정의용 줄임말), I/ML, Maligning(및 Mal)
다른 방법으로는 왼쪽 화살표 또는 키워드를 사용할 수 있습니다.다만, 보다 드문 다른 배리언트도 있습니다.
variable << expression
마직 variable <- expression
F#, OCaml, R, S variable <<- expression
R assign("variable", expression)
R variable ← expression
APL,[30] Smalltalk, BASIC 프로그래밍 variable =: expression
J LET variable = expression
기본의 let variable := expression
XQuery set variable to expression
애플 스크립트 set variable = expression
C 쉘 Set-Variable variable (expression)
PowerShell variable : expression
맥시마, 막시마, K variable: expression
리볼 var variable expression
mIRC 스크립트 언어 reference-variable :- reference-expression
시뮬라
수학적 의사 코드 할당은 일반적으로 왼쪽 화살표로 표시됩니다.
일부 플랫폼에서는 식을 왼쪽에, 변수를 오른쪽에 배치합니다.
MOVE expression TO variable
코볼 expression → variable
TI 베이직, Casio 베이직 expression -> variable
POP-2, 베타, R put expression into variable
라이브 코드 PUT expression IN variable
ABC
Lisp[31][32] 및 Tcl과 같은 일부 표현 지향 언어에서는 할당을 포함한 모든 문장에 동일하게 접두사(또는 postfix) 구문을 사용합니다.
(setf variable expression)
일반적인 리스프 (set! variable expression)
스킴[33][34][35] set variable expression
TCL expression variable !
넷째
「 」를 참조해 주세요.
메모들
- ^ 사용방법
=
Fortran보다 이전 버전이지만 Fortran에 의해 대중화되었습니다.
레퍼런스
- ^ a b "2cs24 Declarative". www.csc.liv.ac.uk. Archived from the original on 24 April 2006. Retrieved 20 April 2018.
- ^ a b c "Imperative Programming". uah.edu. Retrieved 20 April 2018.
- ^ a b c Ruediger-Marcus Flaig (2008). Bioinformatics programming in Python: a practical course for beginners. Wiley-VCH. pp. 98–99. ISBN 978-3-527-32094-3. Retrieved 25 December 2010.
- ^ a b c d e 국경을 넘어: Haskell Archived 2010년 11월 19일 Bruce Tate의 Wayback Machine에서 Haskell과 함께 기능 프로그래밍 탐색
- ^ Mitchell, John C. (2003). Concepts in programming languages. Cambridge University Press. p. 23. ISBN 978-0-521-78098-8. Retrieved 3 January 2011.
- ^ "Imperative Programming Languages (IPL)" (PDF). gwu.edu. Retrieved 20 April 2018.
- ^ John C. Mitchell (2003). Concepts in programming languages. Cambridge University Press. pp. 81–82. ISBN 978-0-521-78098-8. Retrieved 3 January 2011.
- ^ Hudak, Paul (2000). The Haskell School of Expression: Learning Functional Programming Through Multimedia. Cambridge: Cambridge University Press. ISBN 0-521-64408-9.
- ^ "7. Simple statements — Python 3.6.5 documentation". docs.python.org. Retrieved 20 April 2018.
- ^ "CLHS: Macro SETF, PSETF". Common Lisp Hyperspec. LispWorks. Retrieved 23 April 2019.
- ^ Go 프로그래밍 언어 사양:할당
- ^ INMOS Limited, ed. (1988). Occam 2 Reference Manual. New Jersey: Prentice Hall. ISBN 0-13-629312-3.
- ^ Wall, Larry; Christiansen, Tom; Schwartz, Randal C. (1996). Perl Programming Language (2 ed.). Cambridge: O´Reilly. ISBN 1-56592-149-6.
- ^ Lutz, Mark (2001). Python Programming Language (2 ed.). Sebastopol: O´Reilly. ISBN 0-596-00085-5.
- ^ Thomas, David; Hunt, Andrew (2001). Programming Ruby: The Pragmatic Programmer's Guide. Upper Saddle River: Addison Wesley. ISBN 0-201-71089-7.
- ^ D.W. Barron et al., "CPL의 주요 특징", 컴퓨터 저널 6:2:140(1963).전문(설명)
- ^ "PEP 3132 -- Extended Iterable Unpacking". legacy.python.org. Retrieved 20 April 2018.
- ^ "Destructuring assignment". MDN Web Docs. Retrieved 20 April 2018.
- ^ "Deconstructing tuples and other types". Microsoft Docs. Microsoft. Retrieved 29 August 2019.
- ^ 유효 이동: "마지막으로 이동에는 쉼표 연산자가 없으며 ++ 및 --는 식이 아닌 문입니다.따라서 에서 여러 변수를 실행하는 경우 병렬 할당을 사용해야 합니다(단, ++ 및 --는 제외).
- ^ Niklaus Wirth. "Good Ideas, Through the Looking Glass". CiteSeerX 10.1.1.88.8309.
{{cite web}}
:누락 또는 비어 있음url=
(도움말) - ^ Corbet (6 November 2003). "An attempt to backdoor the kernel".
- ^ Moore, Lawrie (1980). Foundations of Programming with Pascal. New York: John Wiley & Sons. ISBN 0-470-26939-1.
- ^ Meyer, Bertrand (1992). Eiffel the Language. Hemel Hempstead: Prentice Hall International(UK). ISBN 0-13-247925-7.
- ^ Wiener, Richard (1996). An Object-Oriented Introduction to Computer Science Using Eiffel. Upper Saddle River, New Jersey: Prentice Hall. ISBN 0-13-183872-5.
- ^ Feinberg, Neal; Keene, Sonya E.; Mathews, Robert O.; Withington, P. Tucker (1997). Dylan Programming. Massachusetts: Addison Wesley. ISBN 0-201-47976-1.
- ^ "PEP 572 – Assignment Expressions". python.org. 28 February 2018. Retrieved 4 March 2020.
- ^ "The Go Programming Language Specification - The Go Programming Language". golang.org. Retrieved 20 April 2018.
- ^ Ullman, Jeffrey D. (1998). Elements of ML Programming: ML97 Edition. Englewood Cliffs, New Jersey: Prentice Hall. ISBN 0-13-790387-1.
- ^ Iverson, Kenneth E. (1962). A Programming Language. John Wiley and Sons. ISBN 0-471-43014-5. Archived from the original on 2009-06-04. Retrieved 2010-05-09.
- ^ Graham, Paul (1996). ANSI Common Lisp. New Jersey: Prentice Hall. ISBN 0-13-370875-6.
- ^ Steele, Guy L. (1990). Common Lisp: The Language. Lexington: Digital Press. ISBN 1-55558-041-6.
- ^ Dybvig, R. Kent (1996). The Scheme Programming Language: ANSI Scheme. New Jersey: Prentice Hall. ISBN 0-13-454646-6.
- ^ Smith, Jerry D. (1988). Introduction to Scheme. New Jersey: Prentice Hall. ISBN 0-13-496712-7.
- ^ Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie (1996). Structure and Interpretation of Computer Programs. New Jersey: McGraw-Hill. ISBN 0-07-000484-6.