커먼 리스프

Common Lisp
커먼 리스프
패러다임다중 패러다임: 절차, 기능, 객체 지향, 메타, 반사, 일반
가족리스프
설계자.스콧 팔만, 리처드 P. 가브리엘, 데이비드 A., 켄트 핏만, 가이 스틸, 댄 와인렙
개발자ANSI X3J13 위원회
첫 등장1984년 (38년) (1984년), 1994년 (28년 전) (1994) ANSI Common Lisp용
타이핑 규율다이나믹, 강인함
범위어휘적, 선택적 동적
OS크로스 플랫폼
파일 이름 확장명.lisp, .lsp, .l, .cl, .fasl
웹사이트common-lisp.net
주요 구현
Allegro CL, ABCL, CLISP, Clozure CL, CMKL, ECL, ECL, LispWorks, Sciener CL, SBCL, 상징 공통 Lisp
방언
CLtL1, CLtL2, ANSI 공통 리시프
영향을 받은
Lisp, Lisp Machine Lisp, Maclisp, Scheme, Interlisp
영향받은
Clojure, Dylan, Emacs Lisp, EuLisp, ISLISP, *Lisp, AutoLisp, Julia, Mosse, R, STEL, SubL

CL(Common Lisp, CL)은 ANSI 표준 문서 ANSI INCITS 226-1994(S20018)([1]이전의 X3.226-1994(R1999)에 게재된 Lisp 프로그래밍 언어의 방언이다.[2]하이퍼링크 HTML 버전인 Common Lisp HyperSpec은 ANSI Common Lisp 표준에서 파생되었다.[3]

Common Lisp 언어는 표준화되고 개선된 Maclisp의 후계자로 개발되었다.1980년대 초에는 이미 여러 그룹이 맥Lisp의 다양한 후계자 즉, Lisp Machine Lisp(일명 제타Lisp), Spice Lisp, NILS-1 Lisp를 연구하고 있었다.Common Lisp은 이러한 MacLisp 사투리의 기능을 통합, 표준화 및 확장하고자 했다.Common Lisp은 구현이 아니라 언어 규격이다.[4]Common Lisp 표준의 몇 가지 구현을 이용할 수 있으며, 여기에는 무료 오픈 소스 소프트웨어와 독점 제품이 포함된다.[5]Common Lisp은 범용 다패러다임 프로그래밍 언어다.절차적, 기능적, 객체 지향적 프로그래밍 패러다임의 조합을 지원한다.동적 프로그래밍 언어로서, 효율적인 런타임 프로그램으로 반복 컴파일을 통해 진화적이고 점진적인 소프트웨어 개발을 촉진한다.이러한 점진적 개발은 실행 중인 애플리케이션을 중단하지 않고 대화식으로 수행되는 경우가 많다.

또한 추후의 프로파일링 및 최적화 단계에서 필요에 따라 추가할 수 있는 선택형 주석과 주조를 지원하여 컴파일러가 보다 효율적인 코드를 생성할 수 있도록 한다.예를 들어.fixnum하드웨어 및 구현이 지원하는 범위에서 박스되지 않은 정수를 보유할 수 있으므로 큰 정수나 임의의 정밀도 형식보다 더 효율적인 산술을 할 수 있다.마찬가지로 컴파일러는 최적화 선언을 사용하여 어떤 유형의 안전 수준을 원하는지 모듈별 또는 기능별로 알 수 있다.

Common Lisp은 멀티모드와 메서드 조합을 지원하는 객체 시스템CLOST를 포함한다.그것은 종종 메타 오브젝트 프로토콜로 구현된다.

Common Lisp은 Lisp 매크로(코드 변환)와 리더 매크로(문자의 입력 파서)와 같은 표준 기능을 통해 확장 가능하다.

Common Lisp은 Maclisp 및 John McCarthy의 원래 Lisp와 부분적으로 역호환성을 제공한다.이를 통해 이전 Lisp 소프트웨어를 Common Lisp에 포팅할 수 있다.[6]

역사

Common Lisp에 대한 작업은 1981년 ARPA 관리자인 밥 엥겔모어가 커뮤니티 표준 Lisp 사투리를 개발하기 위한 이니셔티브 이후 시작되었다.[7]초기 언어 설계의 대부분은 전자우편을 통해 이루어졌다.[8][9]1982년 가이 엘 스틸 주니어는 LISP와 기능 프로그래밍에 관한 1982년 ACM 심포지엄에서 Common Lisp에 대한 첫 번째 개요를 발표했다.[10]

첫 번째 언어 설명서는 1984년에 CLTL1로 알려진 공통 Lisp the Language(Common Lisp the Language) 초판으로 출판되었다.1990년에 발행된 제2판(일명 CLtL2)은 ANSI Common Lisp 표준화 과정 중 언어에 대한 많은 변경사항을 통합했다: 확장 LOOP 구문, Common Lisp Object System, 오류 처리를 위한 조건 시스템, 예쁜 프린터와의 인터페이스 등.그러나 CLtL2는 최종 ANSI Common Lisp 표준을 설명하지 않으므로 ANSI Common Lisp에 대한 설명서가 아니다.그 후 1994년에 최종 ANSI Common Lisp 표준이 발표되었다.그 이후로 표준에 대한 업데이트는 발표되지 않았다.Common Lisp(예: 유니코드, Concurrency, CLOST 기반 IO)에 대한 다양한 확장 및 개선이 구현 및 라이브러리에 의해 제공되었다.

구문

Common Lisp은 Lisp의 방언이다.S-expression을 사용하여 코드와 데이터 구조를 모두 나타낸다.함수 호출, 매크로 양식 및 특수 양식은 다음과 같은 예와 같이 연산자의 이름을 먼저 사용하여 목록으로 작성한다.

 (+ 2 2)           ; 2와 2를 더하면 4가 된다.함수의 이름은 '+'이다.Lisp은 그런 운영자가 없다. 
 (디바를 제거하다 *x*)      ; 변수 *x*가 존재하는지 확인,                    ; 가치를 부여하지 않고.별표는 의 일부분이다.                    ; 특수한(글로벌) 변수를 나타내는 관례에 의한 이름.                     ; 기호 *x*는 또한 다음과 같은 속성과 함께 부여된다.                    ; 그것의 후속 바인딩은 어휘적이기 보다는 동적이다.  (세트로 만들다 *x* 42.1)   ; *x* 변수를 부동 소수점 값으로 설정 42.1 
 ;; 숫자를 제곱하는 함수를 정의하십시오.  (반기를 들다 정사각형의 (x)    (* x x)) 
 ;; 기능 실행:  (정사각형의 3)        ; Returns 
 ;; 'let' 구성은 로컬 변수에 대한 범위를 만든다.여기  ;; 변수 'a'는 6에 바인딩되고 변수 'b'는 바인딩됨  ;;;4까지.'let' 내부에는 'body'가 있는데, 여기서 마지막으로 계산된 값이 반환된다.  ;;여기서 a와 b를 추가한 결과는 'let' 식에서 반환된다.  ;; 기호가 포함되지 않은 한, 변수 a와 b는 어휘적 범위를 가진다.  ;; 특수 변수로 표시(예: 이전 DEFVAR)  (하게 하다 ((a 6)        (b 4))    (+ a b))        ; 10을 반환한다. 

데이터 유형

Common Lisp에는 많은 데이터 유형이 있다.

스칼라형

숫자 유형에는 정수, 비율, 부동 소수, 복합 숫자가 포함된다.[11]Common Lisp은 임의의 크기와 정밀도의 숫자 값을 나타내기 위해 비그넘을 사용한다.비율 유형은 정확하게 분수를 나타내며, 여러 언어로 제공되지 않는 시설이다.Common Lisp은 이러한 유형의 숫자 값을 적절하게 자동으로 강제한다.

Common Lisp 문자 유형은 ASCII 문자로 제한되지 않는다.대부분의 현대적인 구현은 유니코드 문자를 허용한다.[12]

기호 유형은 리스프 언어에 공통적이지만, 이들 언어 밖에서는 대부분 알려져 있지 않다.기호는 이름, 값, 함수, 속성 목록 및 패키지의 여러 부분을 가진 고유한 명명된 데이터 개체다.이 중 가치세포기능세포가 가장 중요하다.Lisp의 기호는 종종 다른 언어의 식별자와 유사하게 사용된다: 변수의 값을 보유하는 것이다. 그러나 다른 많은 용도가 있다.일반적으로 기호를 평가하면 그 값이 반환된다.예를 들어, 키워드 패키지의 모든 기호는 스스로 평가한다.Common Lisp의 부울 값은 자체 평가 기호 T와 NIL로 표현된다.Common Lisp은 '패키지'라고 불리는 기호의 네임스페이스를 가지고 있다.

다양한 방법으로 스칼라 숫자 을 반올림할 수 있는 다양한 기능이 있다.함수round인수를 가장 가까운 정수로 반올림하고 반올림한 경우는 짝수로 반올림한다.기능truncate,floor그리고ceiling0, 아래, 위로 각각 반올림한다.이 모든 기능은 버려진 부분 부분을 2차 값으로 반환한다.예를 들어,(floor -2.5)수율 -3, 0.5;(ceiling -2.5)-2, -0.5;(round 2.5)산출량 2, 0.5 및(round 3.5)수확량 4, -0.5.

데이터 구조

Common Lisp의 시퀀스 유형에는 목록, 벡터, 비트 벡터 및 문자열이 포함된다.어떤 시퀀스 유형에서도 작동할 수 있는 작업이 많다.

거의 모든 다른 Lisp 방언에서처럼, Common Lisp의 목록cons cell 또는 pair라고 불리는 conses로 구성되어 있다.단점은 그것의 자동차cdr라고 불리는 두 개의 슬롯을 가진 데이터 구조다.목록은 합의의 연결된 체인 또는 빈 목록이다.각 죄수들의 차는 리스트의 멤버(아마도 다른 리스트는 아마도 다른 리스트일 것이다.각 cdr은 목록의 마지막 cdr을 제외하고 다음 cdr을 가리킨다. cdr은 다음 cdr을 가리킨다.nil일반적으로 구조 또는 클래스 인스턴스를 사용하는 것이 권장되지만, 단서는 나무와 다른 복잡한 데이터 구조를 구현하는 데도 쉽게 사용될 수 있다.단서가 있는 원형 데이터 구조도 만들 수 있다.

Common Lisp은 다차원 어레이를 지원하며, 필요한 경우 조정 가능한 어레이의 크기를 동적으로 조정할 수 있다.다차원 배열을 매트릭스 수학에 사용할 수 있다.벡터는 1차원 배열이다.배열은 어떤 유형이든 멤버로서 운반할 수 있거나(동일한 배열의 혼합형도 포함) 비트 벡터처럼 특정 유형의 멤버를 포함하도록 특화될 수 있다.보통 몇 가지 유형만 지원된다.많은 구현은 사용되는 어레이가 유형 전문일 때 어레이 기능을 최적화할 수 있다.문자열은 문자의 벡터인 반면 비트 벡터비트 벡터인 두 가지 유형 전문 배열 유형이 표준이다.

해시 테이블은 데이터 개체 간의 연결을 저장한다.어떤 물체는 키나 값으로 사용될 수 있다.해시 테이블은 필요에 따라 자동으로 크기가 조정된다.

패키지는 주로 프로그램의 일부를 네임스페이스로 구분하는 데 사용되는 기호 모음입니다.패키지는 공공 인터페이스의 일부로 표시하여 일부 기호를 내보낼 수 있다.패키지는 다른 패키지를 사용할 수 있다.

C 구조체 및 Pascal 기록과 유사한 구조물은 임의의 수와 필드 유형(슬롯이라고 함)을 가진 임의의 복잡한 데이터 구조를 나타낸다.구조물은 단일 상속이 가능하다.

클래스는 구조와 유사하지만 보다 역동적인 기능과 다중 상속 기능을 제공한다.(CLOST 참조).클래스는 Common Lisp에 늦게 추가되었고 구조와 개념적 중첩이 있다.클래스로 생성된 개체를 인스턴스라고 한다.특별한 경우는 일반 기능이다.일반 함수는 기능과 인스턴스다.

기능들

Common Lisp은 1급 기능을 지원한다.예를 들어, 다른 기능을 인수로서 취합하거나 반환 기능을 하는 기능도 쓸 수 있다.이것은 매우 일반적인 운영을 묘사하는 것을 가능하게 한다.

Common Lisp 라이브러리는 이러한 고차 기능에 크게 의존한다.예를 들어,sort함수는 관계 연산자를 인수로, 키 함수는 선택적 키워드 인수로 받아들인다.이는 어떤 유형의 데이터도 정렬할 수 있을 뿐만 아니라 키에 따라 데이터 구조를 정렬하는 데도 사용할 수 있다.

 ;; 관계 연산자로서 >와 <함수를 이용하여 목록을 정렬한다.  (분류하다 (리스트를 작성하다 5 2 6 3 1 4) #'>)   ; 반품 (6 5 4 3 2 1)  (분류하다 (리스트를 작성하다 5 2 6 3 1 4) #'<)   ; 반품 (1 2 3 4 5 6) 
 ;;; 각 하위 목록의 첫 번째 요소에 따라 목록을 정렬한다.  (분류하다 (리스트를 작성하다 '(9 A) '(3 B) '(4 C)) #'< :키 #'맨 처음의)   ; 반품 (3 B) (4 C) (9 A) 

기능에 대한 평가 모델은 매우 간단하다.평가자가 양식을 발견한 경우(f a1 a2...)그러면 f라는 기호가 다음 중 하나라고 가정한다.

  1. 특수 연산자(고정된 목록과 비교하여 쉽게 확인됨)
  2. 매크로 연산자(이전에 정의되었어야 함)
  3. 기호 또는 기호로 시작하는 보조양식일 수 있는 함수의 이름(기본값)lambda.

f가 함수의 이름일 경우, a1, a2, ...의 인수 a1, a2, ...는 좌우 순서로 평가되고 함수가 발견되어 매개변수로 제공된 값과 함께 호출된다.

함수 정의

매크로에서는 함수 정의가 함수의 이름, 모든 인수의 이름 및 함수 본문을 제공하는 함수를 정의한다.

 (반기를 들다 정사각형의 (x)    (* x x)) 

함수 정의에는 최적 설정 또는 인수의 데이터 유형에 대한 힌트를 컴파일러에게 제공하는 선언으로 알려진 컴파일러 지시문이 포함될 수 있다.여기에는 또한 대화형 문서를 제공하기 위해 Lisp 시스템이 사용할 수 있는 문서 문자열(docstring)도 포함될 수 있다.

 (반기를 들다 정사각형의 (x)    "단층 x의 제곱을 계산하시오."    (선언하다 (단발성의 x) (최적화하다 (속력을 내다 3) (디버그 0) (안전의 1)))    ( 단발성의 (* x x))) 

익명 함수(기능 리터럴)는 다음을 사용하여 정의된다.lambda표현(예:(lambda (x) (* x x))그 주장을 제곱하는 함수에 대해.리스프 프로그래밍 스타일은 익명 기능을 인수로 제공하는 데 유용한 고차 함수를 자주 사용한다.

로컬 함수는 다음과 같이 정의될 수 있다.flet그리고labels.

 (고기를 썰다 ((정사각형의 (x)           (* x x)))    (정사각형의 3)) 

기능의 정의 및 조작과 관련된 몇 가지 다른 연산자가 있다.예를 들어, 함수는 다음과 같이 컴파일될 수 있다.compile(일부 Lisp 시스템은 컴파일하라는 지시가 없는 한 기본적으로 인터프리터를 사용하여 기능을 실행하며, 다른 시스템에서는 모든 기능을 컴파일한다.)

일반 함수 및 메서드 정의

매크로defgeneric일반 함수를 정의한다.일반 함수는 방법의 집합이다.매크로defmethod방법을 규정하다

방법은 CLOST 표준 클래스, 시스템 클래스, 구조 클래스 또는 개별 객체보다 매개 변수를 전문화할 수 있다.많은 유형의 경우 해당 시스템 클래스가 있다.

일반 함수를 호출할 때, 다중 디스패치는 사용할 효과적인 방법을 결정한다.

 (유전적 덧셈을 (a b)) 
 (수법을 어기다 덧셈을 ((a 번호를 붙이다) (b 번호를 붙이다))    (+ a b)) 
 (수법을 어기다 덧셈을 ((a 벡터) (b 번호를 붙이다))    (지도를 그리다 'vector (람다 (n) (+ n b)) a)) 
 (수법을 어기다 덧셈을 ((a 벡터) (b 벡터))    (지도를 그리다 'vector #'+ a b)) 
(수법을 어기다 덧셈을 ((a 끈을 매다) (b 끈을 매다))   (결합시키다 '끈' a b)) 
 (덧셈을 2 3)                   ; 5를 반환한다.  (덧셈을 #(1 2 3 4) 7)          ; 반품 #(8 9 10 11)  (덧셈을 #(1 2 3 4) #(4 3 2 1)) ; returns #(5 5 5 5 5)  (덧셈을 "공통 " "LISP")      ; "Common LISP" 반환 

일반 기능도 일급 데이터 유형이다.위에서 설명한 것보다 일반 기능 및 방법에는 더 많은 특징이 있다.

함수 네임스페이스

함수 이름의 네임스페이스는 데이터 변수의 네임스페이스와 별개다.이것은 Common Lisp과 Scheme의 주요 차이점이다.Common Lisp의 경우 함수 네임스페이스에서 이름을 정의하는 연산자는defun,flet,labels,defmethod그리고defgeneric.

함수를 인수로 다른 함수에 전달하려면 함수를 사용해야 한다.function일반적으로 다음과 같이 약칭되는 특수 연산자#'. 첫 번째sort위의 예제는 기호로 명명된 함수를 가리킨다.>코드와 함께 함수 네임스페이스에서#'>. 이와 반대로 그런 식으로 전달된 함수를 부르려면, 그 함수를 사용하게 된다.funcall논거의 조작자

체계의 평가 모델은 더 간단하다: 네임스페이스는 하나뿐이고, 형태 내의 모든 위치는 (어떤 순서로든) 평가된다 – 단지 인수만이 아니다.그러므로 한 방언으로 쓰여진 코드는 다른 방언에서 더 경험이 많은 프로그래머들에게 때때로 혼란스럽다.예를 들어, 많은 Common Lisp 프로그래머들은 로컬로 섀도우 함수 이름을 사용하므로 Scheme에서 문제를 일으킬 수 있는 목록이나 문자열과 같은 기술 변수 이름을 사용하기를 좋아한다.

기능에 대한 별도의 네임스페이스가 장점인지 여부는 Lisp 커뮤니티에서 논쟁의 원천이다.그것은 보통 Lisp-1 대라고 불린다. 리스프-2 토론.Lisp-1은 Scheme의 모델을, Lisp-2는 Common Lisp의 모델을 가리킨다.이 이름들은 리차드 P. 가브리엘켄트 핏먼이 1988년 논문에서 만들어졌는데, 이 두 접근법을 광범위하게 비교하고 있다.[13]

다중 반환 값

Common Lisp은 여러 의 개념을 지원하는데,[14] 여기서 표현식은 항상 하나의 1차 값을 가지지만, 관심 있는 호출자가 수신하고 검사할 수 있는 2차 값도 얼마든지 가질 수 있다.이 개념은 2차 값이 완전히 선택 사항이며 전용 사이드 채널을 통해 전달되기 때문에 목록 값을 반환하는 것과 구별된다.이는 통화자가 2차적 가치가 존재하는지 전혀 모르고 있을 수 있다는 것을 의미하며, 때로는 유용하지만 항상 필요한 것은 아닌 정보를 전달하기 위한 메커니즘을 사용하는 것이 편리하다.예를 들어,

  • TRUNCATE함수는[15] 주어진 숫자를 정수로 0을 향해 반올림한다.그러나 나머지 값도 2차 값으로 돌려주므로 어떤 값이 잘렸는지 쉽게 판단할 수 있다.또한 유클리드 분업을 사소한 것으로 수행하는 데 사용할 수 있는 선택적 구분 매개변수를 지원한다.
(하게 하다 ((x 1266778)       (y 458))   (다중 가치관 (지수의 나머지)       (잘게 자르다 x y)     (형식을 갖추다 못을 박다 "~A로 나누면 ~~나머지~A" x y 지수의 나머지)))  ;;;; => "196778을 458로 나누면 2765 나머지 408" 
  • GETHASH[16] 연관 맵의 키 값 또는 그렇지 않은 경우 기본값 및 값이 발견되었는지 여부를 나타내는 보조 부울 값을 반환한다.따라서 값이 발견되었는지 또는 기본값으로 제공되었는지 여부에 상관하지 않는 코드는 단순히 그대로 사용할 수 있지만, 그러한 구분이 중요한 경우에는 2차 부울을 검사하고 적절히 반응할 수 있다.두 사용 사례 모두 동일한 통화에 의해 지원되며, 두 사용 사례 모두 다른 통화에 의해 불필요하게 부담되거나 제약되지 않는다.언어 수준에서 이 기능을 가지면 다른 언어에서처럼 키의 존재를 확인하거나 null과 비교할 필요가 없어진다.
(반기를 들다 답을 얻다 (도서관)   (겟하쉬 ' 대답하다 도서관 42))  (반기를 들다 답안-1 (도서관)   (형식을 갖추다 못을 박다 "답은 ~A" (답을 얻다 도서관))) ;;;;; 라이브러리에 답이 없을 경우 "답답은 42"로 반환  (반기를 들다 답안-2 (도서관)   (다중 가치관 (대답하다 확실하다)       (답을 얻다 도서관)     (만일 (아닌 확실하다)         "모르겠어."      (형식을 갖추다 못을 박다 "답은 ~A" 대답하다)))) ;;;;; 라이브러리에 답이 없을 경우 "모름" 반환 

다수의 값은 소수의 표준 형식에 의해 지원되며, 그 중 가장 일반적인 것은MULTIPLE-VALUE-BIND2차 값에 접근하기 위한 특수 양식VALUES다중 값 반환의 경우:

(반기를 들다 마법의 팔구공 ()   "확률을 보조 값으로 하여 예측값 반환"   (가치 "아웃룩 굿" (무작위의 1.0)))  ;;;; => "아웃룩 좋다" ;;;; => 0.3187 

기타유형

Common Lisp의 기타 데이터 유형:

  • 경로 이름은 파일 시스템의 파일 및 디렉터리를 나타낸다.Common Lisp pathname 기능은 대부분의 운영 체제의 파일 이름 지정 규칙보다 더 일반적이어서 다양한 시스템에서 Lisp 프로그램의 파일 액세스를 광범위하게 이동시킬 수 있다.
  • 입력 및 출력 스트림은 터미널 또는 열린 파일과 같은 이진 또는 텍스트 데이터의 소스 및 싱크를 나타낸다.
  • Common Lisp에는 PRNG(의사 난수 생성기)가 내장되어 있다.임의 상태 개체는 PRNG를 시드하거나 시퀀스를 재생하도록 할 수 있는 의사 난수의 재사용 가능한 소스를 나타낸다.
  • 조건은 프로그램이 응답할 수 있는 오류, 예외 및 기타 "관심 있는" 이벤트를 나타내기 위해 사용되는 유형이다.
  • 클래스1등급 객체로서, 그 자체가 메타객체 클래스(짧은 메타클라스)라고 하는 클래스의 인스턴스다.
  • 읽기 용량은 Common Lisp의 판독기가 소스 코드의 텍스트를 분석하는 방법을 제어하는 개체 유형이다.코드를 읽을 때 사용 중인 읽기 테이블을 제어함으로써, 프로그래머는 언어의 구문을 변경하거나 확장할 수 있다.

범위

많은 다른 프로그래밍 언어의 프로그램과 마찬가지로, Common Lisp 프로그램들은 변수, 함수, 그리고 많은 다른 종류의 실체를 나타내기 위해 이름을 사용한다.명명된 참조는 적용범위에 따른다.

이름과 이름이 참조하는 실체 사이의 연관성을 바인딩이라고 한다.

범위는 이름이 특정한 구속력을 갖는 것으로 결정되는 상황의 집합을 말한다.

범위 결정자

Common Lisp에서 범위를 결정하는 상황은 다음과 같다.

  • 표현식 내의 참조 위치화합물의 가장 왼쪽 위치인 경우, 특수 연산자 또는 매크로 또는 함수 바인딩을 가리키며, 그렇지 않으면 가변 바인딩이나 다른 것을 가리킨다.
  • 참조가 이루어지는 표현 유형예를 들어.(go x)즉, 라벨에 대한 이전 제어x, 반면에(print x)변수를 나타냄x. 의 두 가지 범위x태그 본문 레이블은 변수 이름과 별도의 네임스페이스에 있으므로 프로그램 텍스트의 동일한 영역에서 활성화할 수 있다.특별한 형태나 매크로 형태는 그 구문에 있는 모든 기호의 의미를 완전히 통제한다.예를 들어, 인(defclass x (a b) ()), 클래스 정의, .(a b)기본 클래스의 목록이기 때문에 클래스 이름 공간에서 이러한 이름이 검색되며x기존 바인딩에 대한 참조가 아니라 에서 파생되는 새로운 클래스의 이름이다.a그리고b이 사실들은 순전히 의 의미론에서 나온다.defclass. 이 표현에 대한 유일한 일반적인 사실은defclass매크로 바인딩을 참조하며, 다른 모든 것은 다음 조건에 따라 결정됨defclass.
  • 프로그램 텍스트 내의 참조 위치.예를 들어, 변수에 대한 참조가 있는 경우x에 대한 바인딩을 정의하는 와 같은 바인딩 구조로 둘러싸인다.x그런 다음 참조는 해당 바인딩에 의해 생성된 범위에 포함된다.
  • 변수 참조의 경우 변수 기호가 로컬 또는 전역으로 특수하게 선언되었는지 여부.이것은 참조가 어휘 환경 내에서 해결되는지 아니면 동적 환경 내에서 해결되는지 결정한다.
  • 참조가 해결되는 환경의 특정 인스턴스환경은 바인딩에 기호를 매핑하는 런타임 사전이다.각 종류의 참조는 각각의 종류의 환경을 사용한다.어휘 변수에 대한 참조는 어휘적 환경(et cetera 등)에서 해결된다.둘 이상의 환경을 동일한 참조와 연결할 수 있다.예를 들어, 재귀나 복수의 스레드의 사용 덕분에, 같은 기능의 복수의 활성화가 동시에 존재할 수 있다.이러한 활성화는 동일한 프로그램 텍스트를 공유하지만 각각 고유한 어휘 환경 인스턴스를 가지고 있다.

기호가 무엇을 의미하는지 이해하려면 공통 리스프 프로그래머는 어떤 종류의 참조가 표현되고 있는지, 그것이 가변 참조인 경우 어떤 종류의 범위를 사용하는지, 또한 런타임 상황: 어떤 환경에서 어떤 참조가 해결되었는지, 환경에 어떤 바인딩이 도입되었는지를 알아야 한다.ra의

환경의 종류

글로벌

Lisp의 일부 환경은 전세계적으로 퍼져있다.예를 들어, 새로운 유형이 정의되면 그 이후의 모든 곳에 알려져 있다.그러한 유형의 참고문헌은 이러한 글로벌 환경에서 찾아볼 수 있다.

동적

Common Lisp의 환경 유형 중 하나는 동적 환경이다.이 환경에서 설정된 바인딩은 동적 범위를 가지며, 이는 바인딩이 다음과 같은 일부 구성의 실행을 시작할 때 설정됨을 의미한다.let블록 및 해당 구성의 실행이 완료되면 사라짐: 블록의 수명은 블록의 동적 활성화 및 비활성화와 연결된다.그러나 동적 바인딩은 해당 블록 내에서만 볼 수 있는 것이 아니라, 해당 블록에서 호출되는 모든 기능에서도 볼 수 있다.이러한 유형의 가시성을 무기한 범위라고 한다.동적 범위(블록의 활성화 및 비활성화에 연결된 수명)와 무한 범위(그 블록에서 호출되는 모든 기능에 표시됨)를 나타내는 바인딩은 동적 범위를 갖는다고 한다.

Common Lisp은 동적 범위 변수를 지원하는데, 이를 특수 변수라고도 한다.어떤 다른 종류의 바인딩은 재시작과 캐치 태그와 같이 반드시 동적으로 범위가 지정된다.함수 바인딩은 다음을 사용하여 동적으로 범위를 지정할 수 없음flet(단사 범위 함수 바인딩만 제공) 그러나 함수 객체(Common Lisp의 첫 번째 수준 객체)는 동적으로 범위 지정 변수에 할당될 수 있으며, 다음과 같이 바인딩된다.let동적 범위 내에서, 그리고 나서 다음을 사용하여 호출된다.funcall또는APPLY.

동적 범위는 글로벌 변수에 참조 명확성과 규율을 추가하기 때문에 매우 유용하다.전지구적 변수들은 컴퓨터 과학에서 잠재적인 오류의 원천으로 눈살을 찌푸리게 되는데, 왜냐하면 그들은 원하지 않는 놀라운 상호작용을 야기하는 모듈들 사이의 은밀한 의사소통 채널을 야기시킬 수 있기 때문이다.

Common Lisp에서는 최상위 바인딩만 있는 특수 변수가 다른 프로그래밍 언어의 전역 변수처럼 동작한다.새로운 값은 그 안에 저장될 수 있고, 그 값은 단지 최상위 바인딩에 있는 것을 대체한다.글로벌 변수의 가치에 대한 부주의한 대체는 글로벌 변수의 사용으로 인한 버그의 핵심이다.그러나 특수 변수를 사용하는 또 다른 방법은 표현식 내에서 새로운 로컬 바인딩을 제공하는 것이다.이를 변수 "재결합"이라고도 한다.동적 범위 변수를 바인딩하면 해당 변수에 대한 새 메모리 위치가 일시적으로 생성되고 이름이 해당 위치와 연결된다.이 바인딩이 적용되는 동안 해당 변수에 대한 모든 참조는 새로운 바인딩을 참조하며, 이전 바인딩은 숨겨져 있다.바인딩 식 실행이 종료되면 임시 메모리 위치가 사라지고, 이전 바인딩이 공개되며, 원래 값은 그대로 유지된다.물론 동일한 변수에 대한 여러 동적 바인딩은 내포될 수 있다.

멀티스레딩을 지원하는 Common Lisp 구현에서 동적 범위는 각 실행 스레드에 한정된다.따라서 특수 변수는 스레드 로컬 스토리지의 추상화 역할을 한다.한 스레드가 특수 변수를 다시 결합하는 경우, 이 리바인딩은 다른 스레드의 해당 변수에 영향을 미치지 않는다.바인딩에 저장된 값은 바인딩을 생성한 스레드로만 검색할 수 있다.각 스레드가 일부 특수 변수를 바인딩하는 경우*x*, 그러면.*x*스레드 로컬 저장소처럼 동작한다.다시 바인딩되지 않는 스레드 중*x*, 그것은 일반적인 글로벌처럼 동작한다: 이 모든 스레드는 동일한 상위 레벨의 바인딩을 가리킨다.*x*.

동적 변수는 추가 함수 매개변수로 나타나지 않고 기능에서 기능으로 암시적으로 전달되는 추가 컨텍스트 정보로 실행 컨텍스트를 확장하는 데 사용할 수 있다.이것은 제어 전송이 관련 없는 코드의 레이어를 통과해야 할 때 특히 유용하며, 이는 단순히 추가 데이터를 전달하기 위해 추가 매개변수로 확장할 수 없다.이런 상황은 보통 글로벌 변수가 필요하다.이 글로벌 변수는 저장 및 복원되어야 하며, 계획이 재귀에서 깨지지 않도록 해야 한다. 동적 변수 재결합은 이 문제를 처리한다.그리고 그 변수는 스레드 로컬(또는 큰 뮤텍스를 사용해야 함)로 만들어져야 계획이 스레드 아래에서 깨지지 않는다. 동적 범위 구현도 이 문제를 처리할 수 있다.

Common Lisp 라이브러리에는 많은 표준 특수 변수가 있다.예를 들어 모든 표준 I/O 스트림은 잘 알려진 특수 변수의 최상위 바인딩에 저장된다.표준 출력 스트림은 *standard-output*에 저장된다.

foo 함수가 표준 출력에 기록한다고 가정합시다.

  (반기를 들다 foo ()     (형식을 갖추다 t "여보세요, 세계")) 

문자열에 출력을 캡처하려면 *standard-output*을 문자열 스트림에 바인딩하여 다음을 호출하십시오.

  (출력 대 문자열의 (*표준-출력*)     (foo)) 
-> "Hello, world"; 수집된 출력이 문자열로 반환됨

어휘소

Common Lisp은 어휘 환경을 지원한다.형식적으로 어휘 환경의 바인딩은 어휘적 범위를 가지며 네임스페이스 유형에 따라 무한 범위 또는 동적 범위를 가질 수 있다.어휘적 범위는 가시성이 바인딩이 설정된 블록으로 물리적으로 제한됨을 의미한다.텍스트로(예: 어휘적으로) 해당 블록에 내장되지 않은 참조는 단순히 그 바인딩을 볼 수 없다.

TAGBODY의 태그는 어휘 범위를 가지고 있다.레이블 X가 들어 있는 TAGBODY에 포함되지 않은 경우 표현식(GO X)이 잘못됨.그러나 레이블 바인딩은 동적 범위를 가지기 때문에 TAGBODY가 실행을 종료할 때 사라진다.어휘소 폐쇄의 호출에 의해 코드 블록이 다시 입력되는 경우, 해당 폐쇄의 본체가 GO를 통해 태그로 제어권을 이전하려고 시도하는 것은 무효다.

  (디바를 제거하다 *stashed*) ;; 기능을 보유함    (태그바디     (세트로 만들다 *stashed* (람다 () (가다 모종의)))     (가다 종말의) ;;; 생략("Hello" 인쇄)    모종의     (인쇄하다 "여보세요")    종말의)   -> NIL 

TAGBODY가 실행되면 먼저 특수 변수 *stashed*에 함수를 저장하는 setf 양식을 평가한다.그런 다음 (go end-label)은 코드("Hello" 인쇄)를 건너뛰고 엔드 라벨로 제어 권한을 이전한다.엔드 라벨은 태그 본체의 끝에 있으므로 태그 본체는 종료되며, NIL이 발생한다.이전에 기억된 함수를 이제 다음과 같이 부린다고 가정합시다.

  (펑콜 *stashed*) ;; 에러! 

이 상황은 잘못되었다.한 구현의 응답은 "GO: SOMP-LABel 태그의 태그 본체가 이미 남아 있다"라는 메시지를 포함하는 오류 조건이다.함수는 태그바디에 어휘적으로 내장된 (일부 라벨로 이동)을 평가하려고 했고, 라벨로 분해된다.그러나 태그 본체가 실행되지 않고(범위가 종료됨), 제어 전송을 수행할 수 없음.

Lisp의 로컬 함수 바인딩은 어휘 범위를 가지며, 가변 바인딩도 기본적으로 어휘 범위를 가진다.GO 라벨과 대조적으로, 이 두 라벨은 모두 무한 범위를 가진다.어휘 함수 또는 가변 바인딩이 설정되면, 바인딩이 종료된 구조 이후에도 해당 바인딩에 대한 참조가 가능한 한 계속 존재할 수 있다.어휘적 변수와 설정 구성 종료 후 함수에 대한 참조는 어휘적 폐쇄를 통해 가능하다.

어휘 바인딩은 공통 리스피 변수의 기본 바인딩 모드다.개별 기호의 경우, 지역 선언에 의해서든 글로벌 선언에 의해서든 동적 범위로 전환할 수 있다.후자는 DEFVAR 또는 DEFPARAMETER와 같은 구조를 사용하여 암묵적으로 발생할 수 있다.특수(즉, 동적으로 범위 지정) 변수에는 별표 시그널로 시작하고 끝나는 이름을 갖는 것이 Common Lisp 프로그래밍의 중요한 관례다. *소위 "얼마프 협약"이라고 불리는 것에서.[17]이 규칙을 준수할 경우, 어휘적으로 의도된 변수가 우연히 특수화되지 않도록 특수 변수에 대한 별도의 네임스페이스를 효과적으로 생성한다.

어휘 범위는 몇 가지 이유로 유용하다.

첫째, 변수와 함수에 대한 참조는 런타임 환경 구조가 비교적 단순하기 때문에 효율적인 기계 코드로 컴파일할 수 있다.많은 경우 스토리지를 쌓도록 최적화할 수 있으므로 어휘 스코프를 열고 닫으면 오버헤드가 최소화된다.완전한 폐쇄가 생성되어야 하는 경우에도 폐쇄의 환경에 대한 접근은 여전히 효율적이다. 일반적으로 각 변수는 바인딩 벡터로 오프셋이 되며, 따라서 가변 참조는 베이스 플러스 오프셋 주소 지정 모드를 가진 단순 부하 또는 저장 명령이 된다.

둘째, 어휘 범위(비한정 범위와 결합)는 어휘적 폐쇄를 초래하며, 이는 기능 프로그래밍의 근원이 되는 기능을 1등급 객체로 사용하는 것을 중심으로 프로그래밍의 전체 패러다임을 형성한다.

셋째로, 아마도 가장 중요한 것은 어휘적 폐쇄를 이용하지 않더라도 어휘적 범위의 사용은 프로그램 모듈을 원하지 않는 상호작용으로부터 격리시킨다.가시성이 제한되어 있기 때문에 어휘 변수는 비공개적이다.한 모듈 A가 어휘 변수 X를 바인딩하고 다른 모듈 B를 호출하는 경우, B에서 X에 대한 참조는 우연히 A에서 바인딩된 X로 해결되지 않을 것이다.B는 단순히 X에 접근할 수 없다.변수를 통한 절제된 교호작용이 바람직한 상황의 경우 공통 리스는 특별한 변수를 제공한다.특수 변수를 사용하면 모듈 A에서 호출된 다른 모듈 B가 볼 수 있는 변수 X에 대한 바인딩을 설정할 수 있다.이것을 할 수 있다는 것은 장점이고, 그것이 일어나는 것을 막을 수 있다는 것도 장점이다. 결과적으로, Common Lisp은 어휘적 범위와 동적 범위를 모두 지원한다.

매크로스

Lisp의 매크로는 피상적으로 사용의 함수와 유사하다.그러나 평가되는 식을 나타내기보다는 프로그램 소스 코드의 변환을 나타낸다.매크로는 자신이 둘러싼 소스를 인수로 얻고, 그것들을 매개변수에 묶고, 새로운 소스 형태를 계산한다.이 새로운 형태는 매크로도 사용할 수 있다.매크로 확장은 새로운 소스 양식이 매크로를 사용하지 않을 때까지 반복된다.최종 계산 양식은 런타임에 실행된 소스 코드다.

Lisp에서 매크로의 일반적인 사용:

  • 새 제어 구조(실행:루핑 구조, 분기 구조)
  • 범위 지정 및 바인딩 구성
  • 복잡하고 반복적인 소스 코드의 단순화된 구문
  • 컴파일 시간 사이드 메뉴를 사용한 최상위 정의 양식
  • 데이터 기반 프로그래밍
  • 포함된 도메인별 언어(예: SQL, HTML, Prolog)
  • 암묵적 최종화 양식

다음과 같은 다양한 표준 Common Lisp 기능도 매크로로 구현해야 한다.

  • 표준setf추상화, 할당/액세스 운영자의 사용자 정의 컴파일 시간 확장을 허용
  • with-accessors,with-slots,with-open-file기타 유사한 것WITH매크로스
  • 구현에 따라if또는cond다른 특수 연산자를 기반으로 구축된 매크로.when그리고unless매크로로 구성되다
  • 권력자loop도메인별 언어

매크로는 디프매크로 매크로에 의해 정의된다.특수 연산자 매크로는 로컬(단독 범위) 매크로의 정의를 허용한다.정의 심볼-매크로기호-매크로를 사용하여 기호에 대한 매크로를 정의할 수도 있다.

Paul Graham의 저서 On Lisp은 Common Lisp에서 매크로의 사용을 상세히 묘사하고 있다.더그 호이트의 저서 Let Over Lambda는 매크로에 대한 논의를 확장하면서 "매크로스는 프로그래밍 언어로서 리스프가 가지고 있는 가장 큰 장점이며 어떤 프로그래밍 언어의 가장 큰 장점이다"라고 주장했다.Hoyte는 매크로의 반복적인 개발의 몇 가지 예를 제공한다.

매크로를 사용하여 새 관리 구조 정의 예제

매크로는 Lisp 프로그래머들이 언어에서 새로운 구문 형태를 만들 수 있도록 한다.대표적인 용도는 새로운 제어 구조를 만드는 것이다.예제 매크로는until루핑 구성구문은 다음과 같다.

(테스트 양식*까지)

다음까지 매크로 정의:

(디프매크로 까지 (시험하다 &body 보디)   (하게 하다 ((출발 태그 (젠심 "시작"))         (꼬리표를 붙이다   (젠심 "끝")))     `(태그바디 ,출발 태그               (할 때 ,시험하다 (가다 ,꼬리표를 붙이다))               (기절시키다 ,@보디)               (가다 ,출발 태그)               ,꼬리표를 붙이다))) 

tagbody는 태그 이름을 지정하고 이동 양식을 사용하여 해당 태그로 이동할 수 있는 기능을 제공하는 원시 Common Lisp 특수 연산자다.백쿼트 '는 코드 템플릿을 제공하는 표기법을 제공하며, 여기에 콤마와 함께 선행하는 양식 값이 입력된다.쉼표와 at-sign이 앞에 있는 양식들은 분할되어 있다.태그 본체 형태는 종말 상태를 테스트한다.조건이 맞으면 끝 태그로 점프한다.그렇지 않으면 제공된 바디코드가 실행된 후 출발 태그로 점프한다.

매크로가 될 까지 위의 예:

(까지 (= (무작위의 10) 0)   (글씨를 쓰다 "여보세요")) 

코드는 매크로확장-1 함수를 사용하여 확장할 수 있다.위의 예에 대한 확장은 다음과 같다.

(태그바디  #:START1136  (언제 (제로프 (랜덤 10))    (바둑 #:END1137))  (PROGN (쓰기-라인 "안녕"))  (바둑 #:START1136)  #:END1137) 

매크로 확장 시 변수 테스트 값은 (= (랜덤 10) 0)이고 변수 본체의 값은 ((쓰기 라인 "Hello")이다.몸은 서식의 목록이다.

기호는 대개 자동으로 상향 조정된다.팽창은 두 개의 라벨이 있는 TAGBODY를 사용한다.이 라벨의 기호는 GENSIM에 의해 계산되며 어떤 패키지에도 삽입되지 않는다.두 개의 바둑 양식은 이 태그들을 사용하여 점프한다.tagbody는 (매크로가 아닌) Common Lisp의 원시 연산자이기 때문에, 다른 것으로 확장되지 않을 것이다.확장된 형태는 when 매크로(when macro)를 사용하며, 이 또한 확장될 것이다.소스 형태를 완전히 확장하는 것을 코드 워킹이라고 한다.

완전히 확장(보행)된 형태에서 다음과 같은 경우 형태가 원시 형태로 대체되는 경우:

(태그바디  #:START1136  (IF (제로프 (랜덤 10))      (PROGN (바둑 #:END1137))    NIL)  (PROGN (쓰기-라인 "안녕"))  (바둑 #:START1136))  #:END1137) 

매크로를 포함한 소스 코드를 정상적으로 평가하거나 컴파일하기 전에 모든 매크로를 확장해야 한다.매크로는 추상 구문 트리와 유사하지만 그것들에 한정되지 않는 S-expression을 수용하고 반환하는 기능으로 간주될 수 있다.이러한 기능은 최종 소스 코드를 생성하기 위해 평가자 또는 컴파일러 앞에 호출된다.매크로는 일반 Common Lisp로 작성되며, 사용 가능한 Common Lisp(또는 타사) 연산자를 사용할 수 있다.

가변 캡처 및 섀도잉

Common Lisp 매크로는 흔히 가변 캡쳐라고 하는 것을 할 수 있는데, 매크로 확장 본체의 기호가 호출 컨텍스트의 기호와 일치하여 프로그래머가 다양한 기호가 특별한 의미를 갖는 매크로를 만들 수 있게 한다.변수 캡처라는 용어는 연산자와 함수 네임스페이스, 태그 본문 레이블 네임스페이스, 캐치 태그, 조건 핸들러 및 재시작 네임스페이스를 포함하여 모든 네임스페이스가 원하지 않는 캡처에 취약하기 때문에 다소 오해의 소지가 있다.

가변 캡처는 소프트웨어 결함을 초래할 수 있다.이는 다음 두 가지 방법 중 하나로 발생한다.

  • 첫 번째 방법에서 매크로 확장은 실수로 매크로 작성자가 글로벌 네임스페이스에서 해결할 것으로 가정하는 상징적 참조를 만들 수 있지만 매크로가 확장되는 코드는 해당 참조를 도용하는 로컬 섀도우 정의(shadowing definition)를 제공하기 위해 발생한다.이것을 타입 1 캡처라고 한다.
  • 두 번째 방법인 2타입 캡처(type 2 capture)는 정반대다: 매크로의 일부 인수는 매크로 호출자가 제공하는 코드 조각이며, 그 코드 조각들은 주변 바인딩을 참조하도록 작성된다.그러나 매크로에서는 이러한 코드 조각들을 실수로 일부 참조를 캡처하는 자체 바인딩을 정의하는 확장에 삽입한다.

Lisp의 Scheme 사투리는 두 가지 유형의 캡처 문제를 모두 제거하는 참조 투명성을 제공하는 매크로 쓰기 시스템을 제공한다.이러한 유형의 매크로 시스템은 때때로 "위생적"이라고 불리기도 하는데, 특히 그 지지자들에 의해 (이 문제를 자동으로 해결하지 않는 매크로 시스템을 비위생적이라고 간주한다.)[citation needed]

Common Lisp에서 매크로 위생은 두 가지 방법 중 하나를 보장한다.

한 가지 접근방식은 gensyms: 포획의 위협 없이 매크로 확장에 사용할 수 있는 보장된 고유 기호들을 사용하는 것이다.거시적 정의에서 젠심을 사용하는 것은 수작업이지만, 매크로는 젠심의 인스턴스화 및 사용을 단순화하는 것을 작성할 수 있다.Gensyms는 유형 2 캡처를 쉽게 해결하지만, 매크로 확장은 해당 참조를 캡처하는 주변 코드에서 간섭 기호의 이름을 바꿀 수 없기 때문에 유형 1 캡쳐에는 동일한 방법으로 적용할 수 없다.젠심스는 매크로 확장이 필요한 글로벌 기호에 대해 안정적인 별칭을 제공하는 데 사용될 수 있다.매크로 확장은 잘 알려진 이름보다는 이러한 비밀 별칭을 사용할 것이기 때문에 잘 알려진 이름의 재정립은 매크로에 나쁜 영향을 미치지 않을 것이다.

또 다른 접근법은 패키지를 사용하는 것이다.자체 패키지에 정의된 매크로는 확장 시 해당 패키지에 내부 기호를 사용할 수 있다.패키지 사용은 타입 1과 타입 2 캡처를 다룬다.

그러나 패키지는 표준 Common Lisp 함수 및 연산자에 대한 참조를 캡처한 유형 1을 해결하지 못한다.그 이유는 캡처 문제를 해결하기 위한 패키지의 사용은 개인 기호(한 패키지에 있는 상징물, 수입되지 않거나 다른 패키지에 보이는 것)의 사용을 중심으로 하기 때문이다.반면 Common Lisp 라이브러리 기호는 외부적이며 자주 사용자 정의 패키지로 가져오거나 사용자 정의 패키지에 표시되도록 한다.

다음은 매크로의 확장에서 발생하는 운영자 네임스페이스에서 원하지 않는 캡처의 예다.

 ;;; BYEL의 확장으로 DO를 자유자재로 사용할 수 있음  (디프매크로 까지 (표현 &body 보디)    `(하다 () (,표현) ,@보디))   ;; 매크로릿은 DO에 대한 어휘 연산자 바인딩을 설정함  (매크로렛 ((하다 (...) ... 무엇인가 다른 ...))    (까지 (= (무작위의 10) 0) (글씨를 쓰다 "여보세요"))) 

until매크로가 전화하는 형태로 확장될 것이다.do표준 Common Lisp 매크로(Common Lisp macro)를 참조하기 위한 것이다.do그러나, 이런 맥락에서,do전혀 다른 의미를 가질 수 있기 때문에until제대로 작동하지 않을 수 있다.

Common Lisp은 표준 연산자 및 함수의 섀도잉 문제를 재분석을 금지함으로써 해결한다.표준 연산자를 재정의하기 때문에do, 앞의 것은 실제로 실행이 그것을 진단하고 거부할 수 있는 부적합한 공통 리스의 단편이다.

컨디션 시스템

조건 시스템은 Common Lisp에서 예외 처리를 담당한다.[18]조건, 핸들러재시작을 제공한다.조건은 예외적인 상황을 설명하는 대상이다(예: 오류).조건이 표시되면 Common Lisp 시스템은 이 조건 유형의 처리기를 검색하고 처리기를 호출한다.이제 핸들러는 재시동을 검색하고 이러한 재시동 중 하나를 사용하여 조건 유형 및 조건 개체의 일부로 제공된 관련 정보와 같은 정보를 사용하여 현재 문제를 자동으로 복구할 수 있으며 적절한 재시동 기능을 호출할 수 있다.

이러한 재시작은 코드로 처리되지 않은 경우 사용자가 사용 가능한 재시작 중 하나를 선택하고 호출할 수 있도록 사용자에게 제공할 수 있다(예: 사용자 인터페이스의 일부로 디버거의 재시작).조건 핸들러는 (스택을 풀지 않고) 오류의 컨텍스트에서 호출되기 때문에, 다른 예외 처리 시스템이 이미 현재 루틴을 종료했을 수 있는 많은 경우에 완전한 오류 복구가 가능하다.또한 디버거 자체를 사용자 정의하거나 를 사용하여 교체할 수 있다.*debugger-hook*동적 변수파이널라이저 등 언윈드 프로텍트 형태에서 발견된 코드도 예외에도 불구하고 적절하게 실행된다.

다음 예(기호 제네라 사용)에서 사용자는 파일이 없을 때 Read-Evaluation-Print-LOOP(Read-Evaluation-Print-LOOP)에서 호출한 LISP 함수 테스트에서 파일을 열려고 시도한다.Lisp 시스템은 4번의 재시동을 제공한다.사용자는 다른 경로 이름 재시작을 사용하여 Retry OPEN을 선택하고 다른 경로 이름(lispm-int.lisp 대신 lispm-init.lisp)을 입력한다.사용자 코드에 오류 처리 코드가 포함되어 있지 않다.전체 오류 처리 및 재시작 코드는 사용자 코드를 종료하지 않고도 오류를 처리하고 복구할 수 있는 Lisp 시스템에 의해 제공된다.

명령: (">zipy>lispm-int.lisp" 테스트) 오류:파일을 찾을 수 없었다.lispm을 위해서:>zippy>,lispm-int.lisp.newest LMFS:OPEN-LOCAL-LMFS-1 아르지닌 0:#P"lispm:>zippy>,lispm-int.lisp.newest"s-A,<>Resume&gt은 시도하시거나 개방 lispm의:>zippy>,lispm-int.lisp.newest s-B:시거나 개방 다른 경로 이름 s-C,<>Abort> 사용하고:Lisp 최상위에 TELNET 서버 s-D에:프로세스를 재시작해 주세요. TELNET 터미널 ->, 리다른 경로 이름을 사용하여 OPEN 시도 [default lispm:>zipy>lispm-int.lisp.newest]: lispm:>zippm-init.lisp.newest...프로그램이 계속되다

CLOS(Common Lisp Object System)

Common Lisp에는 객체 지향 프로그래밍을 위한 툴킷, Common Lisp Object System 또는 CLOST가 포함되어 있으며, 이 툴킷은 모든 언어에서 사용 가능한 가장 강력한 객체 시스템 중 하나이다.예를 들어, Peter Norvig는 CLOST(다중 상속, 믹신, 멀티메토드, 메타클라스, 메서드 조합 등)[19]의 특징으로 동적 언어로 구현하기 더 간단한 설계 패턴의 수를 설명한다.객체 지향 프로그래밍을 위한 Common Lisp에 대한 몇 가지 확장이 ANSI Common Lisp 표준에 포함되도록 제안되었지만, 결국 CLOST가 Common Lisp의 표준 객체 시스템으로 채택되었다.CLOST는 다중 디스패치다중 상속이 가능한 동적 객체 시스템으로, C++자바와 같은 정적 언어로 발견되는 OOP 설비와는 근본적으로 다르다.동적 객체 시스템으로서, CLOST는 런타임에 일반적인 기능과 클래스로의 변경을 허용한다.메소드를 추가 및 제거할 수 있고 클래스를 추가 및 재정의할 수 있으며 클래스 변경을 위해 객체를 업데이트할 수 있으며 객체의 클래스를 변경할 수 있다.

CLOST는 ANSI Common Lisp에 통합되었다.일반 함수는 일반 함수처럼 사용할 수 있으며 1급 데이터 유형이다.모든 CLOST 클래스는 Common Lisp 타입 시스템에 통합되어 있다.많은 Common Lisp 유형은 해당 클래스를 가지고 있다.CLOST를 Common Lisp에 사용할 가능성이 더 많다.명세서에는 CLOST로 조건이 이행되는지 명시되어 있지 않다.경로명과 스트림은 CLOST로 구현할 수 있다.ANSI Common Lisp의 CLOST 사용 가능성은 표준의 일부가 아니다.실제 Common Lisp 구현에서는 경로 이름, 스트림, 입출력, 조건, CLOST 자체의 구현 등에 CLOST를 사용한다.

컴파일러 및 인터프리터

Lisp 통역자는 s-expression에서 읽은 Lisp 객체(목록, 기호, 숫자, ...)로 제공된 Lisp 소스 코드를 직접 실행한다.Lisp 컴파일러는 Lisp 소스 코드에서 바이트 코드 또는 기계 코드를 생성한다.Common Lisp은 개별 Lisp 기능을 모두 메모리에 컴파일하고 전체 파일을 외부로 저장된 컴파일 코드(fasl 파일)로 컴파일할 수 있도록 한다.

초기 Lisp 방언의 몇 가지 구현은 통역사와 컴파일러 모두를 제공했다.불행하게도 종종 의미론들은 달랐다.이들 초기 Lisps는 컴파일러에서 어휘 범위 지정과 통역기에서 동적 범위 지정을 구현했다.Common Lisp은 통역자와 컴파일러 모두 기본적으로 어휘 범위 지정을 사용하도록 요구한다.Common Lisp 표준은 통역자와 컴파일러의 의미론 모두를 설명한다.컴파일러는 개별 기능에 대해 컴파일 함수를 사용하고 파일에는 컴파일 파일을 사용하여 호출할 수 있다.Common Lisp은 형식 선언을 허용하고 컴파일러 코드 생성 정책에 영향을 미치는 방법을 제공한다.후자의 경우 다양한 최적화 품질은 속도, 공간, 안전, 디버그 및 컴파일 속도 등 0(중요하지 않음)과 3(가장 중요함) 사이의 값을 부여할 수 있다.

Lisp 코드를 평가하는 기능도 있다.eval.eval일부 다른 언어에서처럼, 텍스트 문자열처럼 코드가 미리 입력된 s-문자로 입력되지 않는다.이렇게 하면 목록과 기호를 구성하기 위한 일반적인 Lisp 함수로 코드를 구성할 수 있으며, 그 다음 이 코드를 함수로 평가할 수 있다.evalClozure CL 및 SBCL과 같은 몇 가지 공통 Lisp 구현eval컴파일러를 이용해서 말이야함수를 사용하여 코드를 평가하더라도 이렇게 코드를 컴파일한다.eval.

파일 컴파일러는 컴파일 파일 함수를 사용하여 호출된다.컴파일된 코드가 있는 생성된 파일을 fasl(빠른 로드에서) 파일이라고 한다.이러한 fasl 파일과 소스 코드 파일은 실행 중인 Common Lisp 시스템에 기능 로드로 로드할 수 있다.구현에 따라 파일 컴파일러는 바이트 코드(예: Java Virtual Machine), C 언어 코드(다음 C 컴파일러로 컴파일됨) 또는 직접 네이티브 코드를 생성한다.

공통 Lisp 구현은 코드가 완전히 컴파일되더라도 대화형으로 사용할 수 있다.따라서 해석 언어의 개념은 대화형 공통 리스피에는 적용되지 않는다.

언어는 읽기 시간, 컴파일 시간, 로딩 시간 및 런타임을 구분하며, 사용자 코드도 원하는 단계에서 원하는 유형의 처리를 수행하기 위해 이러한 구분을 할 수 있도록 한다.

예를 들어, 일부 특수 운영자는 특히 대화형 개발에 적합하도록 제공된다.defvar값이 이미 바인딩되지 않은 경우에만 제공된 변수에 값을 할당함defparameter항상 과제를 수행한다.이 구분은 실시간 영상에서 대화식으로 코드를 평가, 컴파일 및 로드할 때 유용하다.

컴파일러와 통역사를 쓰는 것을 돕기 위해 몇몇 기능도 제공된다.기호는 1단계 객체로 구성되며 사용자 코드로 직접 조작할 수 있다.progv특수 운영자는 프로그래밍 방식으로 어휘 바인딩을 만들 수 있는 반면, 패키지도 조작할 수 있다.Lisp 컴파일러는 런타임에 파일이나 개별 기능을 컴파일할 수 있다.이것들이 Lisp을 다른 언어의 중간 컴파일러나 통역자로 사용하기 쉽게 만든다.

코드 예제

생일 역설

다음 프로그램은 독특한 생일 확률이 50% 미만인 방에서 가장 적은 사람 수를 계산한다(생일 역설, 1명의 경우 확률은 분명히 100%이고 2명은 364/365 등).답은 23이다.

관례에 따라 Common Lisp의 상수는 + 문자로 둘러싸여 있다.

(불변의 +년 사이즈+ 365)  (반기를 들다 생일 축하의 (개연성 인원수)   (하게 하다 ((신식의 (* (/ (- +년 사이즈+ 인원수)                                +년 사이즈+)                             개연성)))     (만일 (< 신식의 0.5)         (1+ 인원수)         (생일 축하의 신식의 (1+ 인원수))))) 

REF(Read Eval Print Loop)를 사용하여 예제 함수 호출:

CL-USER > (생일-파라독스 1.0 1) 23

사용자 개체 목록 정렬

우리는 클래스를 정의한다.person그리고 사람의 이름과 나이를 표시하는 방법.다음으로 우리는 사람들의 그룹을 목록으로 정의한다.person물건들그리고 우리는 분류된 리스트를 반복한다.

(품위를 손상하다 사람 ()   ((이름을 붙이다 :initarg :이름 :액세서리 이름을 붙이다)    (나이를 먹다  :initarg :age  :액세서리 사람 나이))   (:documentation "NAME과 AGE가 있는 클래스 Person."))  (수법을 어기다 전시하다 ((반대하다 사람) 물줄기가 흐르다)   "Person 개체를 출력 스트림에 표시"   (무턱대고 (이름을 붙이다 나이를 먹다) 반대하다     (형식을 갖추다 물줄기가 흐르다 "~a (~a)" 이름을 붙이다 나이를 먹다)))  (역모수 *그룹*   (리스트를 작성하다 (가공의 '사람' :이름 "밥"   :age 33)         (가공의 '사람' :이름 "크리스" :age 16)         (가공의 '사람' :이름 "아쉬"   :age 23))   "Person 객체 목록.")  (돌리스트 (사람 (분류하다 (카피리스트 *그룹*)                       #'>                       :키 #'사람 나이))   (전시하다 사람 *표준-출력*)   (테리프리의)) 

그것은 이 세 명의 이름들을 내림세로 인쇄한다.

밥(33) 애쉬(23) 크리스(16)

제곱에 의한 지수화

LOOP 매크로의 사용은 다음과 같이 입증된다.

(반기를 들다  (x n)   (고리를 틀다 와 함께 결과 = 1         하는 동안에 (더하기 n)         할 때 (oddp n) 하다 (세트로 만들다 결과 (* 결과 x))         하다 (세트로 만들다 x (* x x)                  n (잘게 자르다 n 2))         종국에는 (돌아오다 결과))) 

사용 예:

CL-USER > (전원 2 200) 16069380442589902755419620923411626025 2993782792835301376

내장된 지수와 비교:

CL-USER > (= (2 200 제외)(전원 2 200)t

사용 가능한 셸 목록 찾기

WITH-OPEN-FILE은 파일을 열고 스트림을 제공하는 매크로다.양식이 돌아오면 파일은 자동으로 닫힌다.FUNCLALL은 함수 객체를 호출한다.LOOP는 술어와 일치하는 모든 라인을 수집한다.

(반기를 들다 리스트-스케줄 라인 (파일 술어를 붙이다)   "file에서 술어가 적용된 줄 목록을 반환함 그 선은 T를 돌려준다."   (공개 파일이 있는 (물줄기가 흐르다 파일)     (고리를 틀다 을 위해 선을 긋다 = (줄을 긋다 물줄기가 흐르다 못을 박다 못을 박다)           하는 동안에 선을 긋다           할 때 (펑콜 술어를 붙이다 선을 긋다)           모으다 그럭저럭))) 

AVAILABLE-ShELLs 함수는 위의 함수 LIST-Matching-LINES를 pathname과 익명 함수를 술어로 부른다.술어는 셸 또는 NIL의 경로 이름을 반환한다(문자열이 셸의 파일 이름이 아닌 경우).

(반기를 들다 이용 가능한 (&optional (파일 #p"/etc/properties"))   (리스트-스케줄 라인    파일    (람다 (선을 긋다)      (그리고 (더하기 (길이 선을 긋다))           (char= (마를 뜨다 선을 긋다 0) #\/)           (경로명            (현악기 오른쪽의 '(#\space #\cHB) 선을 긋다)))))) 

예시 결과(Mac OS X 10.6):

CL-USER > (이용 가능한) (#P"/bin/bash" #P"/bin/cch" #P"/bin/ksh" #P"/bin/sh" #P"/bin/tcsh" #P"/bin/zsh") 

다른 Lisps와의 비교

Common Lisp은 두 개의 가장 인기 있는 Lisp 방언이기 때문에 Scheme과 가장 자주 비교되고 대조된다.Scheme은 CL보다 앞서며, 동일한 Lisp 전통뿐만 아니라 Guy L. Steel과 같은 엔지니어 출신이다. Guy L. Steel은 Gerald Jay Sussman과 함께 Scheme을 설계했고, Common Lisp의 표준 위원장을 맡았다.

Common Lisp은 특정 제품내장된 확장 언어인 Emacs LISP, AutoLISP와 같은 Lisp 변종과는 대조적으로 범용 프로그래밍 언어다(각각 GNU Emacs와 AutoCAD).이전의 많은 Lisps와는 달리 Common Lisp (like Scheme)은 해석된 코드와 컴파일된 코드 모두에 대해 기본적으로 어휘 변수 범위를 사용한다.

ZetaLisp 및 Franz Lisp와 같이 설계가 Common Lisp에 기여한 대부분의 Lisp 시스템은 통역기에 동적으로 범위 지정 변수를 사용하고 컴파일러에는 어휘적으로 범위 지정 변수를 사용했다.Scheme은 Lisp에 어휘적으로 범위화된 변수들의 단독 사용을 도입했다; ALGOL 68에서 영감을 얻었다. CL은 또한 동적으로 범위된 변수를 지원하지만, 그것들은 "특별하다"고 명시적으로 선언되어야 한다.ANSI CL 통역사와 컴파일러 간 범위 지정에는 차이가 없다.

CL이 기능과 변수에 대해 별도의 네임스페이스를 사용하는 것을 가리켜 CL은 Lisp-2와 Scheme a Lisp-1이라고 부르기도 한다.(실제로 CL은 바둑 태그, 블록 이름 등 네임스페이스가 많다.loop키워드).여러 네임스페이스에 관련된 트레이드오프를 둘러싸고 CL과 Scheme 옹호자들 사이에 오랜 논쟁이 있다.체계에서, 기능과 충돌하는 변수 이름을 주지 않는 것이 (광범위하게) 필요하다; 체계 함수는 종종 명명된 인수를 가지고 있다.lis,lst또는lyst시스템 기능과 충돌하지 않도록list단, CL에서는 함수를 인수로 전달할 때 함수 네임스페이스를 명시적으로 참조할 필요가 있으며, 이 역시 인수로서 흔히 볼 수 있는 일이다.sort상기의 예

또한 CL은 부울 값을 처리하는 데 있어 체계와 다르다.계획은 진리와 거짓을 나타내기 위해 #t와 #f의 특별한 값을 사용한다.CL은 기호 T와 NIL을 사용하는 오래된 Lisp 관례를 따르며, NIL은 또한 빈 리스트를 위해 서 있다.CL에서 NIL이 아닌 모든 값은 다음과 같은 조건들에 의해 참으로 처리된다.if, 반면에 체계에서 #f가 아닌 모든 값은 참으로 취급된다.이러한 규약을 통해 두 언어의 일부 연산자는 술어(부울 값 질문 반전)와 추가 계산을 위한 유용한 값을 모두 반환할 수 있지만, 체계에서는 공통 리스의 NIL과 동등한 값 '()이 부울 식에서 참으로 평가된다.

마지막으로, Scheme 표준 문서에는 Tail-call 최적화가 필요하지만, CL 표준은 그렇지 않다.대부분의 CL 구현은 프로그래머가 최적화 지시어를 사용하는 경우에만 종종 Tail-call 최적화를 제공한다.그럼에도 불구하고, 일반적인 CL 코딩 스타일은 Scheme 스타일이 선호하는 재귀의 유비쿼터스 사용을 선호하지 않는다. 즉, Scheme 프로그래머가 꼬리 재귀로 표현하고, CL 사용자는 보통 다음에서 반복적인 표현으로 표현한다.do,dolist,loop, 또는 (더 최근에)iterate꾸러미

구현

Common Lisp 구현 범주를 참조하십시오.

Common Lisp은 하나의 구현(Perl과 같은)이 아닌 사양(Ada, C와 같은)에 의해 정의된다.많은 구현이 있으며, 표준은 이러한 구현이 타당하게 다를 수 있는 영역을 상세하게 설명한다.

또한 구현에는 표준에서 다루지 않는 기능을 제공하는 확장 기능이 수반되는 경향이 있다.

  • 대화형 최상위 수준(REPL)
  • 디버거, 스테퍼 및 검사기
  • 취약한 데이터 구조(해시 테이블)
  • 확장 가능한 시퀀스
  • 확장 가능한 LOOP
  • 환경 액세스
  • CLOST 메타 객체 프로토콜
  • CLOST 기반 확장 가능한 스트림
  • CLOST 기반 조건 시스템
  • 네트워크 스트림
  • 영구 클로징
  • 유니코드 지원
  • 외국어 인터페이스(종종 C에 해당)
  • 운영 체제 인터페이스
  • 자바 인터페이스
  • 스레드 및 다중 처리
  • 애플리케이션 제공(애플리케이션, 동적 라이브러리)
  • 이미지 저장

무료오픈 소스 소프트웨어 라이브러리는 Common Lisp에 대한 확장을 휴대용 방식으로 지원하기 위해 만들어졌으며, Common-Lisp.net[20] 및 CLOCC(Common Lisp Open Code Collection)[21] 프로젝트의 저장소에서 가장 눈에 띈다.

공통 Lisp 구현은 네이티브 코드 컴파일, 바이트 코드 컴파일 또는 해석의 모든 조합을 사용할 수 있다.Common Lisp은 증분 컴파일러, 파일 컴파일러 및 블록 컴파일러를 지원하도록 설계되었다.컴파일을 최적화하기 위한 표준 선언문(예: inlineing 또는 type professionalization)은 언어 규격에서 제안된다.대부분의 일반 Lisp 구현은 소스 코드를 기본 시스템 코드로 컴파일한다.일부 구현에서는 (최적화된) 독립형 애플리케이션을 생성할 수 있다.다른 것들은 해석된 바이트 코드로 컴파일하는데, 이것은 네이티브 코드보다 효율성은 떨어지지만 바이너리 코드 이동성은 용이하다.일부 컴파일러는 C 코드에 Common Lisp 코드를 컴파일한다.Lisp가 순전히 해석된 언어라는 오해는 Lisp 환경이 대화형 프롬프트를 제공하고 그 코드가 증분적으로 하나씩 컴파일되기 때문일 가능성이 크다.Common Lisp 증분 컴파일이 널리 사용된다.

일부 Unix 기반 구현(CLISP, SBCL)은 스크립팅 언어로 사용될 수 있으며, 즉 Perl 또는 Unix 셸 통역기가 있는 방식으로 시스템에서 투명하게 호출된다.[22]

구현 목록

상업적 구현

알레그로 커먼 리스프
Microsoft Windows, FreeBSD, Linux, Apple MacOS 및 다양한 UNIX 모델용.Allegro CL은 (Windows와 Linux용) 통합 개발 환경(IDE)과 애플리케이션 전달을 위한 광범위한 기능을 제공한다.
리퀴드 커먼 리스프
전에는 루시드 커먼 리스프라고 불렸다.유지 관리만 할 뿐, 새로운 릴리스는 없다.
리스프웍스
Microsoft Windows, FreeBSD, Linux, Apple MacOS, iOS, Android 및 다양한 UNIX 모델용.LispWorks는 IDE(Integrated Development Environment)와 애플리케이션 제공을 위한 광범위한 기능을 제공한다.
모클
iOS, Android 및 MacOS용.
오픈 제네라
DEC 알파용.
시네어 커먼 리스프
고성능 과학 컴퓨팅을 위해 설계된 제품.

자유롭게 재배포 가능한 구현

무장 베어 커먼 리스프(ABCL)
Java Virtual Machine에서 실행되는 CL 구현.[23]컴파일러에서 자바 바이트 코드까지 포함하며, CL에서 자바 라이브러리에 접속할 수 있다.그것은 이전에는 무장 곰 J 편집자의 일부분일 뿐이었다.
클리스프
바이트 코드 컴파일 구현, 이동식 및 여러 Unix 및 Unix 유사 시스템(macOS 포함)뿐만 아니라 Microsoft Windows 및 여러 다른 시스템에서 실행.
클로저 CL(CCL)
원래 Macintosh Common Lisp의 무료 오픈 소스 포크.그 역사가 암시하듯이, CCL은 매킨토시를 위해 쓰여졌지만, Clozure CL은 현재 MacOS, FreeBSD, Linux, Solaris, Windows에서 실행된다.각 플랫폼에서 32비트 및 64비트 x86 포트가 지원된다.또한 Mac OS와 Linux용 Power PC 포트도 있다.CCL은 이전에는 OpenMCL로 알려져 있었지만, Macintosh Common Lisp의 오픈 소스 버전과의 혼동을 피하기 위해 더 이상 그 이름이 사용되지 않는다.
CMKLF
원래 카네기 멜론 대학교 출신이며, 현재는 자원봉사자 그룹에 의해 무료 오픈소스 소프트웨어로 유지되고 있다.CMKLF는 빠른 네이티브 코드 컴파일러를 사용한다.Intel x86용 LinuxBSD, Alpha용 Linux, Intel x86용 MacOS 및 Power에서 사용 가능PC; 그리고 기본 플랫폼에 Solaris, IRIX 및 HP-UX.
코먼 커먼 리스프
Microsoft Windows용2015년 1월 코먼 리스프는 MIT 면허에 따라 출판되었다.[24]
임베디드 커먼 리스프(ECL)
ECL은 바이트코드 통역기와 컴파일러를 포함한다.또한 C 컴파일러를 통해 Lisp 코드를 기계 코드로 컴파일할 수 있다.그런 다음 ECL은 Lisp 코드를 C로 컴파일하고 C 컴파일러로 C 코드를 컴파일한 다음 결과 기계 코드를 로드할 수 있다.C 프로그램에 ECL을, C 코드는 Common Lisp 프로그램에 임베드하는 것도 가능하다.
GNU 커먼 리스프(GCL)
GNU 프로젝트의 Lisp 컴파일러.그러나 아직 완전히 ANSI를 준수하지 않은 GSL은 수학 도구인 Maxima, AXIOM 및 (역사적으로) ACL2를 포함한 몇 가지 대형 프로젝트를 위한 선택 구현이다.GCL은 11개의 다른 아키텍처에서 Linux에서 실행되며, Windows, Solaris 및 FreeB에서도 실행된다.SD.
Macintosh Common Lisp(MCL)
Mac OS X를 실행하는 PowerPC 프로세서가 탑재된 Apple Macintosh 컴퓨터용 버전 5.2는 오픈 소스다.RMCL(MCL 5.2 기반)은 애플의 로제타 바이너리 번역기를 사용하여 인텔 기반의 애플 매킨토시 컴퓨터에서 실행된다.
만카이 커먼 리스프(MKCL)
ECL. MKCL의 지부는 고도로 재작업되고 기본적으로 다중 스레드 런타임 시스템을 통해 신뢰성, 안정성 및 전반적인 코드 품질을 강조한다.Linux에서 MKCL은 POSIX 호환 런타임 시스템을 갖추고 있다.
모비츠
어떤 기본 OS에도 의존하지 않고 x86 컴퓨터를 위한 Lisp 환경 구현
팝로그
Poplog는 POP-11과 선택적으로 Prolog, 그리고 SML(표준 ML)의 버전을 구현하여 혼합 언어 프로그래밍을 허용한다.전체적으로 구현 언어는 POP-11로, 점진적으로 컴파일된다.컴파일러와 통신하는 이맥스 같은 통합 에디터도 갖추고 있다.
스틸 뱅크 커먼 리스프(SBCL)
CMUCL에서 지류."대체로 말하면 SBCL CMU CL에서 유지 관리성에 보다 역점에 의해 두드러진다."[25]SBCL CMUCL, HP/UX을 제외하고 그 플랫폼에 하고, 그것에 맞추다 Linux에 AMD64, 파워 PC, 스팍, MIPS, Windowsx86[26]되며 기본적으로 통역관을 이용하지 않는다 WindowsAMD64.SBCL을 운영해 실험적인 지원이 있고, a를 운영한다.ll 표현식은 사용자가 통역기를 켜지 않는 한 기본 코드로 컴파일된다.SBCL 컴파일러는 이전 버전의 컴퓨터 언어 벤치마크 게임에 따라 빠른 네이티브 코드를 생성한다.[27]
우파소프트 커먼 리스프
CLISP for 윈도우즈 플랫폼용 포트(코어가 C++로 기록됨).

기타 구현

오스틴 교토 커먼 리스프
빌 셸터에 의한 교토 커먼 리스프 진화
버터플라이 커먼 리스프
BBN 나비 다중 프로세서 컴퓨터[28][29] 계획서에 쓰여진 구현
CLICC
C 컴파일러에[30] 대한 공통 리스피
클로에
심볼릭에 의한 PC용 공통 Lisp
코데미스트 커먼 리스프
컴퓨터 대수 시스템의 상용 버전에 사용되는 Axiom[31][32].
ExperienceCommon Lisp
Expert에 의한 Apple Macintosh의 초기 구현텔리겐스
골든 커먼 리스프
골드힐 [33][34]사의 PC용 구현
이부키 커먼 리스프
교토 커먼 리스프 상용화판
교토 커먼 리스프
C를 대상 언어로 사용한 최초의 Common Lisp 컴파일러GCL, ECL 및 MKCL은 이 Common Lisp 구현에서 비롯되었다.
L
IS Robotics가 개발한 임베디드 시스템용 Common Lisp의 작은 버전, 현재 iRobot[35]
Lisp 머신(심볼릭스, TI[36][37] 및 제록스 제품[38])
기본 Lisp 사투리(Lisp Machine Lisp 또는 Interlisp) 외에 Common Lisp 구현 제공CLOST도 가능했다.심볼릭스는 향상된 버전의 Common Lisp을 제공한다.[39][40][41]
프로시온 커먼 리스프
프란츠가 그들의 윈도우 포트 알레그로 CL을 위해 사용하는 윈도우와 맥 OS를 위한 구현
스타 사파이어 커먼 LISP
PC를 위한 구현
서브엘
Cyc 지식 기반 시스템의[42] 구현에 사용되는 Common Lisp의 변종
최상위 커먼 리스프
동시 집행을[43] 위한 조기 이행
WCL
공유 도서관 구현[44][45]
VAX 커먼 리스프
VMS 또는 ULTRIX를 실행하는 VAX 시스템에서 실행된 Digital Equipment Corporation의 구현
XLISP
데이비드 베츠가[46] 쓴 시행.

적용들

Common Lisp은 신속한 프로토타입 개발 또는 배포된 애플리케이션을 위한 연구 애플리케이션(인공지능에서 종종 사용됨)을 개발하기 위해 사용된다.

Common Lisp은 Yahoo를 포함한 많은 상업용 애플리케이션에서 사용된다.원래 폴 그레이엄이 참여했던 스토어 웹커머스 사이트는 나중에 C++로 다시 작성되었다.[47]그 밖의 주목할 만한 예는 다음과 같다.

또한 다음과 같은 Common Lisp로 작성된 오픈 소스 애플리케이션도 존재한다.

참고 항목

참조

  1. ^ "ANSI Standards Action - December 28, 2018" (PDF). ansi.org.
  2. ^ 인용 표준의 표지에서 인용.ANSI INCITS 226-1994 [S2008], 표준 문서 페이지 2020년 9월 27일 웨이백 머신판매.
  3. ^ "CLHS: About the Common Lisp HyperSpec (TM)". lispworks.com.
  4. ^ "CLHS: Section 1.1.2". lispworks.com.
  5. ^ "Common Lisp Implementations: A Survey". Archived from the original on April 21, 2012. Retrieved December 22, 2007.
  6. ^ "Old LISP programs still run in Common Lisp". Retrieved May 13, 2015.
  7. ^ "Roots of "Yu-Shiang Lisp", Mail from Jon L White, 1982". cmu.edu.
  8. ^ "Mail Index". cl-su-ai.lisp.se.
  9. ^ Nev-jerk Anti-LOOPism 및 기타 전자우편 현상: 컴퓨터 매개 통신의 구강, 서면 전자적 패턴, JoAnne YatesWanda J. Orlikowski, 1993년 8월 8일 웨이백 기계보관
  10. ^ Jr, Steele; L, Guy (August 15, 1982). An overview of COMMON LISP. Lfp '82. ACM. pp. 98–107. doi:10.1145/800068.802140. ISBN 9780897910828. S2CID 14517358.
  11. ^ Reddy, Abhishek (August 22, 2008). "Features of Common Lisp".
  12. ^ "Unicode support". The Common Lisp Wiki. Retrieved August 21, 2008.
  13. ^ Richard P. Gabriel; Kent M. Pitman (June 1988). "Technical Issues of Separation in Function Cells and Value Cells". Lisp and Symbolic Computation. 1 (1): 81–101. doi:10.1007/bf01806178. S2CID 26716515.
  14. ^ "Common Lisp Hyperspec: Section 3.1.7".
  15. ^ "Common Lisp Hyperspec: Function FLOOR".
  16. ^ "Common Lisp Hyperspec: Accessor GETHASH".
  17. ^ "Let Over Lambda". letoverlambda.com.
  18. ^ Peter Seibel (April 7, 2005). Practical Common Lisp. Apress. ISBN 978-1-59059-239-7.
  19. ^ "Design Patterns in Dynamic Programming". norvig.com.
  20. ^ "Common-Lisp.net".
  21. ^ "Common Lisp Open Code Collection".
  22. ^ "32.6. Quickstarting delivery with CLISP". clisp.cons.org.
  23. ^ "Armed Bear Common Lisp".
  24. ^ "Corman Lisp sources are now available".
  25. ^ "History and Copyright". Steel Bank Common Lisp.
  26. ^ "Platform Table". Steel Bank Common Lisp.
  27. ^ "Which programs are fastest? – Computer Language Benchmarks Game". May 20, 2013. Archived from the original on May 20, 2013.
  28. ^ "Package: lang/lisp/impl/bbn/". cs.cmu.edu.
  29. ^ "Recent Developments in Butterfly Lisp, 1987, AAAI Proceedings" (PDF). aaai.org.
  30. ^ Burkart, O.; Goerigk, W.; Knutzen, H. (June 22, 1992). "CLICC: A New Approach to the Compilation of Common Lisp Programs to C". CiteSeerX 10.1.1.38.1282. {{cite journal}}:Cite 저널은 필요로 한다. journal=(도움말)
  31. ^ "codemist.co.uk". lisp.codemist.co.uk.
  32. ^ "Axiom, the 30 year horizon, page 43" (PDF).
  33. ^ "Golden Common Lisp Developer". goldhill-inc.com.
  34. ^ 골든 커먼 LISP: 데이비드 J. 스틸, 애디슨 웨슬리 출판사 2000년 6월
  35. ^ Brooks, Rodney A.; al., et (June 22, 1995). "L – A Common Lisp for Embedded Systems". CiteSeerX 10.1.1.2.1953. {{cite journal}}:Cite 저널은 필요로 한다. journal=(도움말)
  36. ^ "TI Explorer Programming Concepts" (PDF).
  37. ^ "TI Explorer Lisp Reference" (PDF).
  38. ^ "Medley Lisp Release Notes" (PDF).
  39. ^ "Symbolics Common Lisp Dictionary" (PDF). trailing-edge.com.
  40. ^ "Symbolics Common Lisp Language Concepts" (PDF). trailing-edge.com.
  41. ^ "Symbolics Common Lisp Programming Constructs" (PDF). trailing-edge.com.
  42. ^ "SubL Reference – Cycorp". cyc.com.
  43. ^ "Top Level Inc. – Software Preservation Group". softwarepreservation.org.
  44. ^ WCL: Unix , LISP기능 프로그래밍에 관한 1992년 ACM 컨퍼런스 진행, 260–269페이지에 따라 효율적인 Common Lisp 애플리케이션 제공
  45. ^ "commonlisp.net :: WCL". pgc.com. Archived from the original on April 5, 2016. Retrieved March 25, 2016.
  46. ^ "Package: lang/lisp/impl/xlisp/". cs.cmu.edu.
  47. ^ "Beating the Averages". paulgraham.com.
  48. ^ "Authorizer's Assistant" (PDF). aaai.org.
  49. ^ American Express Authorizer's Assistant 2009년 12월 12일 웨이백 머신보관
  50. ^ 실시간 애플리케이션 개발 2016년 8월 2일 웨이백 머신보관.젠심.2016년 8월 16일 회수.
  51. ^ "Genworks GDL".
  52. ^ "Opusmodus – Home".
  53. ^ PWGL – 2013년 7월 17일 회수된 웨이백 머신에서 2011년 5월 3일 홈 아카이브.
  54. ^ a b "Aerospace – Common Lisp". lisp-lang.org.
  55. ^ "Piano Users, retrieved from manufacturer page".
  56. ^ "Grammarly.com, Running Lisp in Production".
  57. ^ "Remote Agent". ti.arc.nasa.gov.
  58. ^ "Lisping at JPL".
  59. ^ "Franz Inc Customer Applications: NASA". franz.com.
  60. ^ Spike Planning and Scheduling System.Stsci.edu.2013년 7월 17일 검색됨
  61. ^ "Franz Inc Customer Applications: Space Telescope Institute". franz.com.
  62. ^ "How It All Started…AKA the Birth of the CLR". microsoft.com.
  63. ^ Huffman, Steve. "on lisp". Upvoted. Archived from the original on May 17, 2018. Retrieved May 11, 2019.
  64. ^ "Pgloader".
  65. ^ "Why is pgloader so much faster".

참고 문헌 목록

Common Lisp(언어) 또는 Common Lisp(특히 AI 프로그래밍)을 사용한 프로그래밍에 대해 출판(또는 곧 출판될 예정)된 책의 시간별 목록.

외부 링크

  • Quicklisp - Common Lisp을 위한 매우 인기 있고 고품질 라이브러리 관리자
  • Common Lisp 프레임워크 및 라이브러리의 커리큘럼 목록인 어썸 CL 목록.
  • 공동 프로젝트인 Common Lisp Cookbook.
  • CLiki, Unix 유사 시스템에서 실행되는 무료 오픈 소스 Common Lisp 시스템용 Wiki.
  • 소프트웨어에 대한 무료 Common Lisp의 주요 저장소 중 하나는 Common-Lisp.net이다.
  • 아마존닷컴은 문서와 성공 사례의 쇼케이스를 가지고 있다.
  • Common Lisp의 이력에 대한 개요:
  • Common Lisp Quick Reference – Common Lisp 표준 언어에 대한 간략한 개요
  • Planet Lisp 기사 Common Lisp.
  • Quickdocs는 많은 Quicklisp 프로젝트에 대한 문서 및 종속성 정보를 요약한다.