리스프(프로그래밍 언어)

Lisp (programming language)
리스프
Lisp logo.svg
패러다임멀티패러다임: 기능성, 절차성, 반사성, 메타
설계자존 매카시
개발자스티브 러셀, 티모시 P.하트, 마이크 레빈
처음 등장한1958년, 64년(연방)
타이핑 분야다이내믹하고 강력함
사투리
영향을 받다
IPL
영향받은

Lisp(이력 LISP)는 오랜 역사와 괄호로 둘러싸인 독특프리픽스 [3]표기법을 가진 프로그래밍 언어 패밀리입니다.원래 1958년에 지정된 Lisp는 여전히 일반적으로 사용되는 두 번째로 오래된 고급 프로그래밍 언어입니다.Fortran만 1년 [4][5]더 나이가 많습니다.리스프는 초창기부터 변했고, 많은 방언이 그 역사를 통해 존재해왔다.현재 가장 잘 알려진 범용 리스프 방언Racket, Common Lisp, SchemeClojure입니다.[citation needed]

리스프는 원래 알론조 교회의 람다 미적분 [6]표기법에 영향을 받아 컴퓨터 프로그램을 위한 실용적수학 표기법으로 만들어졌습니다.그것은 빠르게 인공지능 [7]연구에서 선호되는 프로그래밍 언어가 되었다.최초의 프로그래밍 언어 중 하나인 Lisp는 트리 데이터 구조, 자동 스토리지 관리, 동적 타이핑, 조건, 고차 함수, 재귀, 자가 호스팅 [8]컴파일러 및 읽기 평가 인쇄 [9]루프를 포함한 컴퓨터 과학 분야의 많은 아이디어를 개척했습니다.

LISP라는 이름은 "LIST 프로세서"[10]에서 유래했습니다.링크 리스트는 Lisp의 주요 데이터 구조 중 하나이며, Lisp 소스 코드는 목록으로 구성됩니다.따라서, Lisp 프로그램은 소스 코드를 데이터 구조로서 조작할 수 있어 프로그래머가 Lisp에 내장된 새로운 구문이나 새로운 도메인 고유의 언어를 만들 수 있는 매크로 시스템을 만들 수 있습니다.

코드와 데이터의 호환성을 통해 Lisp는 즉시 인식할 수 있는 구문을 제공합니다.모든 프로그램 코드는 s-식 또는 괄호 안의 목록으로 작성됩니다.함수 호출 또는 구문 형식은 함수 또는 연산자 이름이 먼저이고 인수가 뒤에 이어지는 목록으로 작성됩니다. 예를 들어 함수f3개의 논거를 필요로 하는 것은(f arg1 arg2 arg3).

역사

존 맥카시는 1958년 매사추세츠 공과대학(MIT)에 있을 때 리스프를 개발했다.McCarthy는 1960년 Communications of the ACM의 "Recursive Functions of Symbolic Expressions and Thees Computation by Machine, Part I"[11]라는 제목의 논문에서 디자인을 발표했습니다.그는 몇 개의 간단한 연산자와 교회에서 빌린 익명 함수에 대한 표기법으로 알고리즘에 대한 튜링-완전 언어를 만들 수 있다는 것을 보여주었다.

정보처리 언어는 1955년 또는 1956년 최초의 AI 언어였으며 리스트 처리와 재귀와 같은 많은 개념들이 이미 포함되었고 리스프에서 사용되게 되었다.

맥카시의 원래 표기법은 S 표현으로 번역되는 괄호로 묶인 "M-expressions"를 사용했다.예를 들어, M-식은car[cons[A,B]]S-표현과 같다.(car (cons A B))Lisp가 구현되자 프로그래머들은 빠르게 S-식을 선택하였고 M-식은 포기되었다.M-표현은 Horace Enea[12] MLisp와 Vaughan Pratt의 CGOL의 짧은 시도로 다시 표면화되었습니다.

Lisp는 IBM 704 컴퓨터에서 펀치 카드를 사용하여 [13]Steve Russell에 의해 처음 구현되었습니다.Russell은 McCarthy의 논문을 읽고 Lisp 평가 기능이 기계어로 구현될 수 있다는 것을 깨달았다.

McCarthy에 [14]따르면:

스티브 러셀이 말하길, " 이 평가를 프로그램하지 않느냐"고 물었죠. 그리고 저는 그에게 말했습니다. "호호호, 이론과 연습을 혼동하는군요." 이 평가는 읽기를 위한 것이지, 컴퓨터를 위한 것이 아닙니다.하지만 그는 먼저 가서 해냈다.즉, 그는 논문의 평가를 IBM 704 머신 코드로 편집하여 버그를 수정한 후 리스프 인터프리터로 광고했습니다.그것은 틀림없습니다.그 시점에서 리스프는 본질적으로 오늘날과 같은 형태를 가지고 있었습니다.

그 결과 리스프 인터프리터가 작동하여 리스프 프로그램을 실행하거나 더 적절하게 "리스프 표현식 평가"를 수행할 수 있게 되었습니다.

IBM 704용 어셈블리 언어 매크로는 목록 분해를 위한 원시적인 작업이 되었습니다. (레지스터 번호의 주소 부분 내용) 및 (레지스터 [15]번호의 감소 부분 내용). 여기서 "레지스터"는 컴퓨터의 중앙 처리 장치(CPU)의 레지스터를 의미합니다.리스프 방언은 여전히 사용되고 있다.car그리고.cdr목록의 첫 번째 항목을 반환하는 작업과 목록의 나머지 항목을 반환하는 작업의 경우 각각 (/kcccccr/ 및 /ccckccdcr/).

Lisp로 작성된 최초의 완전한 Lisp 컴파일러는 1962년 MIT의 Tim Hart와 Mike Levin에 의해 구현되었으며, 기존의 LISP 인터프리터가 컴파일러 코드를 해석하도록 함으로써 컴파일할 수 있었으며,[16] 인터프리터보다 속도가 40배 향상되었다.이 컴파일러는 컴파일된 함수와 해석된 함수가 자유롭게 혼합될 수 있는 증분 컴파일의 리스프 모델을 도입했습니다.하트와 레빈의 메모에 사용된 언어는 맥카시의 초기 코드보다 현대 리스프 스타일에 훨씬 더 가깝다.

쓰레기 수거 루틴은 [17]1962년 이전에 MIT 대학원생[citation needed] 다니엘 에드워즈에 의해 개발되었습니다.

1980년대와 1990년대에 새로운 리스프 방언(대부분 제타리스프나 NIL(New Implementation of Lisp)과 같은 Maclisp의 후계자)에 대한 작업을 단일 언어로 통합하기 위해 많은 노력이 이루어졌다.새로운 언어인 Common Lisp는 그것이 대체한 방언과 어느 정도 호환성이 있었다(Common Lisp the Language는 다양한 구조의 호환성에 주목하고 있다).1994년에 ANSI는 Common Lisp 표준인 "ANSI X3.226-1994 정보기술 프로그래밍 언어 공통 Lisp"를 발행했습니다.

타임라인

1955 1960 1965 1970 1975 1980 1985 1990 1995 2000 2005 2010 2015 2020
LISP 1, 1.5, LISP 2(abandoned)
마클리스프
인터리스크
MDL
리스프 기계 리스프
스킴 R5RS R6RS R7RS 소형
없음
ZIL(Zork 구현 언어)
프란츠 리스프
일반적인 리스프
르 리스프
MIT 스킴
T
체즈 스킴
Emacs 리스프
자동 LISP
피코리스프
EuLisp
ISLISP
오픈리스프
PLT 방식 라켓
GNU Guile
비주얼 LISP
클로쥬르
LFE
하이

인공지능과의 연계

Lisp는 초기부터 인공지능 연구 커뮤니티, 특히 PDP-10[18] 시스템과 밀접하게 연결되어 있었습니다.Lisp는 유명 AI 시스템 SHRDLU에 사용된 언어 Micro Planner의 구현으로 사용되었으며, 1970년대 AI 연구로 상용화되면서 프로그래머가 다양한 기법의 성능 파장과 선택지를 숙지해야 하는 등 기존 Lisp 시스템의 성능이 점차 문제가 되었다.nisp [19]구현에 관여하고 있습니다.

계보 및 변종

60년의 역사를 통해 Lisp는 S-표현 언어의 핵심 주제에 대해 많은 변형을 만들어 왔습니다.게다가 각 방언에는 여러 가지 구현이 있을 수 있습니다.예를 들어, 12개 이상의 공통 리스프 구현이 있습니다.

예를 들어 Common Lisp에서는 다음 키워드를 사용합니다.defun함수의 이름을 붙이는데 Scheme는define그러나 표준화된 방언 내에서 적합한 구현은 동일한 핵심 언어를 지원하지만 확장과 라이브러리는 다릅니다.[20]

역사적으로 중요한 방언

MIT 박물관의 리스프 기계
4.3 위스콘신 대학BSD, Franz Lispman 페이지를 표시합니다.
  • LISP[21] 1 –최초의 실장.
  • LISP 1[22].5 – MIT의 McCarthy와 다른 사람들에 의해 개발된 첫 번째 널리 배포된 버전. 원래 "LISP 1" 인터프리터에 대한 몇 가지 개선 사항이 포함되었지만 계획된 LISP 2와 같은 대규모 재구성은 아니었다.
  • Stanford LISP 1[23].6 – Stanford AI Lab에서 개발한 LISP 1.5의 후속 제품으로 TOPS-10 운영체제를 실행하는 PDP-10 시스템에 널리 배포되었습니다.Maclisp와 InterLisp에 의해 사용되지 않게 되었습니다.
  • MACLISP[24] – MIT Project MAC용으로 개발된 MACLISP는 LISP 1.5의 직계 후손입니다.PDP-10 및 Multics 시스템에서 실행되었습니다.MACLISP는 나중에 Maclisp로 불리게 되며 종종 MacLisp로 불리게 됩니다.MacLISP의 "MAC"는 애플의 MacintoshMcCarthy와 관련이 없습니다.
  • Interlisp[25] – BBN Technologies에서 개발한 TENEX 운영체제용 PDP-10 시스템.이후 InterLisp-D로 Xerox Lisp 머신의 "West Coast" Lisp로 채택되었습니다.'Inter'라는 작은 버전LISP 65"는 6502 기반의 Atari 8비트 패밀리 컴퓨터 제품군용으로 공개되었습니다.한동안 맥리스프와 인터리스프는 강력한 경쟁자였다.
  • Franz Lisp – 원래 캘리포니아 대학교 버클리 프로젝트였는데, 나중에 Franz Inc.에 의해 개발되었습니다.이 이름은 "Franz List"라는 이름을 유머러스하게 변형한 것으로, 프란츠사가 최근 판매한 Common Lisp의 방언인 Allegro Common Lisp를 지칭하지 않는다.
  • AutoLISP의 기반이 된 XLISP.
  • 표준 리스프휴대용 표준 리스프는 특히 컴퓨터 대수 시스템 REDURE와 함께 널리 사용되고 이식되었습니다.
  • 제타 리스프(Lisp Machine Lisp라고도 함)는 Maclisp의 직계 후손인 리스프 머신에 사용됩니다.제타 리스프는 일반 리스프에 큰 영향을 미쳤다.
  • 리스프는 프랑스 리스프 방언이다.최초의 인터페이스 빌더(SOS[26] 인터페이스) 중 하나는 LeLisp로 작성되었습니다.
  • 스킴(1975).[27]
  • Common Lisp the Language에서 설명한 바와 같이 Common Lisp(1984년)는 Maclisp의 후속[28] 사투리를 작성하기 위한 여러 가지 다양한 시도(ZetaLisp, Spice Lisp, NILS-1 Lisp)를 통합하여 스킴 사투리에서 상당한 영향을 받았습니다.이 버전의 Common Lisp는 광범위한 플랫폼에서 사용할 수 있으며 ANSI Common Lisp(ANSI X3.226-1994)가 발행될 때까지 사실상[29] 표준으로 받아들여졌습니다.Common Lisp의 가장 일반적인 하위 용어로는 Steel Bank Common Lisp(SBCL), CMU Common Lisp(CMU-CL), Clozure OpenMCL(Clojure!와 혼동하지 말 것), GNU CLISP 및 이후 버전의 Franz Lisp가 있습니다.
  • 딜런은 첫 번째 버전에서 Scheme와 Common Lisp Object System을 혼합한 것입니다.
  • EuLisp – 효율적이고 깔끔한 새로운 Lisp 개발을 시도합니다.
  • ISLISP – 효율적이고 깔끔한 새로운 리스프를 개발하려고 합니다.ISO/IEC 13816:1997으로[30] 표준화되어 ISO/IEC 13816:[31]2007로 개정되었습니다.정보 테크놀로지 프로그래밍 언어, 환경시스템 소프트웨어 인터페이스 프로그래밍 언어 ISLISP.
  • IEEE 방식 – IEEE 표준, 1178–1990(R1995).
  • ANSI Common Lisp – Common Lisp에 대한 American National Standards Institute(ANSI) 표준으로, X3J13 소위원회가 작성으로[32], Common Lisp로 시작하는 것을 전제로 하고 있습니다. 기본 문서로서의 언어 및 프로그램의 이식성공통 리스프 구현의 호환성이라는 공통 문제에 대한 해결책을 찾기 위한 국민적 합의 프로세스를 수행합니다.공식적으로는 ANSI 표준이지만, ANSI Common Lisp의 구현, 판매, 사용 및 영향은 전 세계적으로 나타나고 있으며, 앞으로도 계속 나타나고 있습니다.
  • ACL2 또는 "A Computational Logic for Application Common Lisp"는 공통 LISP의 적용적(부작용이 없는) 변형입니다.ACL2는 컴퓨터 시스템을 모델링할 수 있는 프로그래밍 언어이며 이러한 모델의 속성을 증명하는 데 도움이 되는 도구입니다.
  • Clojure는 Java 가상 머신에 컴파일되어 동시성에 특히 초점을 맞춘 Lisp의 최근 방언입니다.
  • GOAL(Game Oriented Assembly Lisp)Nutty Dog의 Andy Gavin이 개발한 비디오 게임 프로그래밍 언어입니다.Allegro Common Lisp를 사용하여 작성되었으며 Nutty Dog가 개발한 JakDaxter 시리즈 게임 전체의 개발에 사용되었다.
  • Chialisp는 Chia 블록체인의 온체인 프로그래밍 환경인 CLVM으로 요약되는 고급 방언입니다.

2000년 이후

1990년대 다소 하락세를 보였던 리스프는 2000년 이후 다시 관심을 갖게 됐다.대부분의 새로운 액티비티는 Common Lisp, Scheme, Emacs Lisp, ClojureRacket의 구현에 중점을 두고 있으며 새로운 휴대용 라이브러리와 애플리케이션 개발을 포함하고 있습니다.

많은 새로운 리스프 프로그래머들은 그레이엄과 에릭 S와 같은 작가들로부터 영감을 받았다. 레이먼드는 다른 사람들이 구식으로 여기는 언어를 추구했다.새로운 Lisp 프로그래머들은 종종 이 언어를 놀라운 경험으로 묘사하며 다른 [33]언어보다 훨씬 생산적이라고 주장합니다.이러한 인식의 증가는 "와 대조될 수 있습니다.AI [34]winter"와 Lisp의 1990년대 중반의 짧은 실적.

2010년 현재 적극적으로 유지 보수되고 있는 Common [35]Lisp 실장은 11개입니다.Scieneer Common Lisp는 CMUCL에서 2002년 첫 출시로 분기된 새로운 상용 구현입니다.

오픈 소스 커뮤니티는 새로운 지원 인프라스트럭처를 구축했습니다.CLiki는 공통 리스프 관련 정보를 수집하는 Wiki, 공통 리스프 디렉토리 목록 리소스, #lisp는 일반적인 IRC 채널로 코드 스니펫 공유 및 코멘트를 허용합니다(리스페스트 지원을 통해 Lispaste로 작성된 IRC 봇, Planet Lisp는 콘텐츠를 수집합니다.다양한 Lisp 관련 블로그의 Lisp Forum 사용자는 Lisp 토픽에 대해 토론합니다.Lispjobs는 구인 공고를 위한 서비스이며 주간 뉴스 서비스인 Weekly Lisp News가 있습니다.Common-lisp.net은 오픈소스 Common Lisp 프로젝트 호스팅 사이트입니다.Quicklisp는 Common Lisp의 라이브러리 매니저입니다.

LISP50@OOPSLA에서 [36]리스프(1958–2008)의 50년을 기념했습니다.Boston, Vancouver 및 Hamburg에서는 정기적으로 로컬 사용자 회의가 있습니다.다른 행사로는 유럽 공통 리스프 회의, 유럽 리스프 심포지엄, 국제 리스프 회의가 있습니다.

Scheme 커뮤니티는 20개 이상의 구현을 적극적으로 유지하고 있습니다.2000년대(10년)에 몇 가지 중요한 새로운 구현(치킨, 감빗, 고슈, Ikarus, Larceny, 입실론)이 개발되었습니다.알고리즘 언어[37] 체계 표준에 관한 개정 보고서는 체계5 커뮤니티에서 널리 받아들여졌다.Scheme Requests for Implementation 프로세스는 Scheme를 위한 많은 준표준 라이브러리와 확장을 만들었습니다.개별 스킴 구현 사용자 커뮤니티는 계속 증가하고 있습니다.2003년에 새로운 언어 표준화 프로세스가 시작되어 2007년에 RRS6 Scheme 표준이 도입되었습니다.컴퓨터 공학을 가르치기 위한 스킴의 학술적 이용은 다소 감소한 것으로 보인다.일부 대학은 컴퓨터 과학 [38][39]입문 과정에 Scheme를 더 이상 사용하지 않습니다. MIT는 현재 학부 컴퓨터 과학 프로그램 및 MITx 대규모 오픈 [40][41]온라인 과정에 Scheme 대신 Python을 사용하고 있습니다.

리스프의 몇몇 새로운 방언들있다: 아크, 하이, 누, 리스켈 그리고 LFE.Julia의 파서는 Scheme의 방언인 Femtolisp로 구현됩니다(Julia는 Scheme에서 영감을 받았고, 이는 다시 리스프 방언입니다).

2019년 10월 폴 그레이엄벨의 사양인 "리스프의 새로운 방언"을 발표했습니다.

주요 방언

공통 리스프와 스킴은 리스프 개발의 두 가지 주요 흐름을 나타냅니다.이들 언어에는 현저하게 다른 설계 선택지가 포함되어 있습니다.

Common LispMaclisp의 후속 버전입니다.주요 영향으로는 리스프 머신 리스프, Maclisp, NIL, S-1 리스프, Spice 리스프 [42]및 스킴이 있습니다.Lisp Machine Lisp(Lisp Machine을 프로그래밍하는 데 사용되는 큰 Lisp 방언)의 많은 기능을 가지고 있지만, 모든 개인용 컴퓨터나 워크스테이션에서 효율적으로 구현될 수 있도록 설계되었습니다.Common Lisp는 범용 프로그래밍 언어이므로 많은 내장 데이터 유형, 함수, 매크로 및 기타 언어 요소 및 객체 시스템(Common Lisp Object System)을 포함하는 대규모 언어 표준을 가지고 있습니다.Common Lisp는 또한 어휘 범위 지정 및 어휘 폐쇄와 같은 특정 기능을 체계에서 차용했다.LLVM,[43] Java 가상 머신,[44] x86-64, PowerPC, Alpha, ARM, Motorola 68000, MIPS [45]등의 다양한 플랫폼과 Windows, macOS, Linux, Solaris, FreeBSD, NetBSD, OpenBSD Dragon 등의 운영 체제를 대상으로 하는 일반적인 Lisp 구현을 사용할 수 있습니다.

Scheme는 Guy L. Stele, Jr.와 Gerald Jay Sussman고안한 리스프 프로그래밍 언어의 정적 범위와 적절한 테일 재귀적 방언입니다.그것은 매우 명확하고 단순한 의미론들과 표현들을 형성하기 위한 몇 가지 다른 방법들을 가지도록 설계되었다.Common Lisp보다 약 10년 전에 설계된 Scheme는 보다 미니멀리즘적인 디자인입니다.표준 기능 세트는 훨씬 작지만, Common Lisp에 지정되어 있지 않은 특정 실장 기능(테일 콜의 최적화나 풀 계속 등)이 있습니다.명령형, 기능형 및 메시지 전달 스타일을 포함한 다양한 프로그래밍 패러다임이 Scheme에서 편리한 표현을 찾을 수 있습니다.스킴은 일련의 표준(알고리즘 언어 스킴에 관한 개정n 보고서)과 일련의 스킴 요구의 실장에 수반해 계속 진화하고 있습니다.

Clojure는 Lisp의 최근 방언으로 주로 Java 가상 머신과 CLR(Common Language Runtime), Python VM, Ruby VM YARV 및 JavaScript 컴파일을 대상으로 합니다.실용적인 범용 언어가 되도록 설계되어 있습니다.Clojure는 Haskell로부터 상당한 영향을 받고 불변성을 [47]매우 강조합니다.Clojure는 Java 프레임워크와 라이브러리에 대한 접근을 제공하며 옵션 유형 힌트와 유형 추론을 통해 Java에 대한 호출이 반영을 피하고 빠른 원시 작업을 가능하게 합니다.Clojure는 다른 리스프 [48]방언과 하위 호환되도록 설계되지 않았습니다.

또한 리스프 방언은 많은 응용 프로그램에서 스크립트 언어로 사용되며, 가장 잘 알려진 것은 Emacs 편집기의 Emacs Lisp, AutoLISP이후 AutoCAD의 Visual Lisp, Audacity의 Nyquist 및 LilyPond의 Scheme입니다.유용한 스킴 인터프리터의 크기가 작을 가능성이 있기 때문에 임베디드 스크립팅에 특히 적합합니다.를 들어 SIOD와 TinyScheme은 모두 GIMP 이미지 프로세서에 "Script-fu"[49]라는 총칭으로 성공적으로 삽입되었습니다.원래 Emacs Lisp 언어에 기반을 둔 John Harper의 Lisp 인터프리터인 LIBREP는 Sawfish[50]관리자에 포함되어 있습니다.

표준화된 방언

Lisp는 R6RS Scheme, R7RS Scheme, IEEE [51]Scheme, ANSI Common Lisp 및 ISO ISLISP의 공식 표준 사투리를 가지고 있습니다.

언어의 혁신

Paul Graham은 Lisp의 9가지 [52]중요한 측면을 Fortran과 같은 기존 언어와 구별했습니다.

Lisp는 프로그램 코드의 구조가 표준 데이터 구조에서 충실하고 직접적으로 표현된 최초의 언어였으며, 이는 나중에 "호모아이코니시티"라고 불리게 되었다.따라서 Lisp 함수는 하위 수준의 조작 없이 Lisp 프로그램 내에서 조작, 변경 또는 생성될 수 있습니다.이는 일반적으로 표현력에 관한 언어의 주요 장점 중 하나로 간주되며, 통사 매크로 및 메타시큘러 평가에 적합합니다.

if-then-else 구문을 사용하는 조건어는 Fortran으로 작성된 체스 프로그램을 위해 McCarthy에 의해 발명되었다.그는 ALGOL에 포함시킬 것을 제안했지만, ALGOL 58 사양에는 포함되지 않았습니다.Lisp의 경우 McCarthy는 보다 일반적인 조건 [53]구조를 사용했습니다.알골 60은 if-else를 도입하여 대중화했다.

Lisp는 Xerox PARC에서 Smalltalk를 개발한 연구팀의 리더인 Alan Kay에게 깊은 영향을 주었고, 그 후 1970년대에 Lisp는 객체 지향 프로그래밍 기능(상속 클래스, 캡슐화 인스턴스, 메시지 전달 등)을 채택하면서 Smalltalk의 영향을 받았다.Flavors 객체 시스템은 다중 상속혼합의 개념을 도입했습니다.Common Lisp Object System은 다중 상속, 다중 디스패치 및 퍼스트 클래스 범용 기능을 제공하여 유연하고 강력한 형태의 동적 디스패치를 제공합니다.이것은 많은 후속 리스프(Scheme 포함) 오브젝트 시스템의 템플릿 역할을 해왔고, 종종 오브젝트 시스템이 그 자체로 정의되는 반사 메타원형 설계인 메타 오브젝트 프로토콜을 통해 구현된다.리스프는 Smalltalk 다음으로 메타 오브젝트 시스템을 가진 두 번째 언어일 뿐이었다(아직도 몇 안 되는 언어 중 하나)였다.수년 후, Alan Kay는 이러한 기능들이 합쳐진 결과, Smalltalk와 Lisp만이 적절하게 구상된 [54]객체 지향 프로그래밍 시스템으로 간주될 수 있다고 제안했다.

Lisp는 자동 가비지 수집 개념을 도입했습니다.이 개념에서는 시스템이 사용되지 않는 메모리를 찾기 위해 히프를 걷고 있습니다.세대별 가비지 수집과 같은 현대의 정교한 가비지 수집 알고리즘의 진보는 [55]리스프에서의 사용에 의해 촉진되었다.

1972년 튜링상 강연에서 에즈거 W. 다이크스트라는 이렇게 말했다.

기초가 되는 몇 가지 기본 원칙을 통해 [LISP]는 현저한 안정성을 보였습니다.그 외에도 LISP는 어떤 의미에서 우리의 가장 정교한 컴퓨터 어플리케이션의 상당수를 담당해 왔습니다.LISP는 우스갯소리로 "컴퓨터를 오용하는 가장 지능적인 방법"으로 묘사되어 왔다.나는 이 묘사가 해방의 맛을 충분히 전달하기 때문에 훌륭한 찬사라고 생각한다. 그것은 이전에 불가능했던 [56]생각을 하는 데 가장 재능 있는 많은 동료들을 도와주었다.

초기 컴퓨팅 하드웨어(초기 마이크로프로세서 포함)에 대한 자원 요구 때문에 리스프는 Fortran 및 ALGOL에서 내려온 C 언어만큼 AI 커뮤니티 밖에서 인기를 끌지 못했습니다.복잡하고 역동적인 응용 프로그램에 적합하기 때문에 Lisp는 [57]2010년대에 다시 일반인의 관심을 끌었습니다.

구문 및 의미론

주의: 이 문서의 예는 Common Lisp로 기재되어 있습니다(대부분은 Scheme에서도 유효합니다).

기호식(S-식)

리스프는 표현 지향 언어입니다.대부분의 다른 언어와 달리, "식"과 "문"[dubious ]은 구분되지 않습니다. 모든 코드와 데이터는 식으로 작성됩니다.식을 평가할 때 값(Common Lisp에서는 여러 값)이 생성되며, 이 값은 다른 식에 포함될 수 있습니다.각 값은 모든 데이터 유형일 수 있습니다.

매카시의 1958년 논문은 코드와 데이터의 내부 표현을 반영하는 기호식(S-expressions, sexps)과 S-expressions의 함수를 표현하는 메타식(M-expressions)의 두 가지 구문을 소개했다.M 표현식은 결코 환영받지 못하며, 오늘날 거의 모든 Lisps는 코드와 데이터를 모두 조작하기 위해 S 표현식을 사용합니다.

괄호 사용은 Lisp가 다른 프로그래밍 언어 패밀리와 가장 확연히 다른 점입니다.그 결과, 학생들은 오랫동안 리스프에게 Lost In Stuffy 괄호, 짜증나는 불필요[58]괄호 많이 붙이는 것과 같은 별명을 지어왔다.그러나 S-표현 구문은 Lisp의 힘의 대부분을 담당합니다. 구문은 단순하고 일관성이 있으며 컴퓨터에 의한 조작이 용이합니다.단, Lisp 구문은 기존의 괄호 표기법에 한정되지 않습니다.대체 표기를 포함하도록 확장할 수 있습니다.예를 들어 XMLisp는 Metaobject 프로토콜을 사용하여 S-식을 XML(Extensible Markup Language)과 통합하는 Common Lisp 확장입니다.

표현에 의존하는 것은 언어에 큰 유연성을 줍니다.Lisp 함수는 목록으로 작성되기 때문에 데이터와 동일하게 처리할 수 있습니다.이를 통해 다른 프로그램을 조작하는 프로그램을 쉽게 작성할 수 있습니다(메타프로그래밍).많은 리스프 방언은 매크로 시스템을 사용하여 이 기능을 이용하고 있으며, 이 기능을 사용하면 언어를 거의 무제한으로 확장할 수 있습니다.

리스트

리스프 목록은 요소를 공백으로 구분하고 괄호로 둘러싸서 씁니다.예를들면,(1 2 foo)의 원자가 있는 원소의 목록입니다. 1,2, 및 . 이러한 값은 암묵적으로 입력됩니다.각각 2개의 정수와 "symbol"이라고 불리는 리스프 고유의 데이터 타입으로, 그렇게 선언할 필요는 없습니다.

빈 리스트()특별한 원자로서도 표현된다.nil이것은 리스프에서 원자이면서 리스트인 유일한 엔티티입니다.

표현식은 프리픽스 표기법을 사용하여 목록으로 작성됩니다.목록의 첫 번째 요소는 함수 이름, 매크로 이름, 람다 식 또는 "특수 연산자" 이름입니다(아래 참조).목록의 나머지 부분은 인수입니다.예를 들어 함수는list인수가 목록으로 반환되므로 식에서는

 (목록. 1 2 (견적을 내다 후우)) 

리스트에 따라 평가하다(1 2 foo)위의 예에서 앞의 '인용'은 인수를 평가하지 않고 반환하는 '특수 연산자'입니다.따옴표로 둘러싸인 식을 평가하기 전에 따옴표로 둘러싸인 식을 재귀적으로 평가합니다.예를들면,

 (목록. 1 2 (목록. 3 4)) 

리스트에 따라 평가하다(1 2 (3 4))세 번째 인수는 목록입니다.목록을 네스트할 수 있습니다.

연산자

산술 연산자도 비슷하게 취급됩니다.표현

 (+ 1 2 3 4) 

10으로 평가합니다.infix 표기법에서 등가는 다음과 같습니다.1 + 2 + 3 + 4".

Lisp는 Algol에서 파생된 언어로 구현된 연산자에 대한 개념이 없습니다.Lisp의 산술 연산자는 변수 함수(또는 n-ary)로, 임의의 수의 인수를 취할 수 있습니다.C 스타일 '+' 증분 연산자는 때때로 이름으로 구현됩니다.incf구문 지정

 (인시프 x) 

에 상당하는(setq x (+ x 1)), 의 새로운 값을 반환한다.x.

"특수 연산자"(때로는 "특수 양식"이라고도 함)는 리스프의 제어 구조를 제공합니다.예를 들어, 특수 연산자는if세 가지 인수를 사용합니다.첫 번째 인수가 nil이 아닌 경우 두 번째 인수로 평가되며, 그렇지 않은 경우 세 번째 인수로 평가됩니다.그래서 표현은

 (한다면 제로      (목록. 1 2 "푸")      (목록. 3 4 '바')) 

까지 평가하다.(3 4 "bar")물론, 이것은 간단한 표현이 아닌 표현으로 대체되었다면 더 유용할 것입니다.nil.

Lisp는 논리연산자 또는 논리연산자 또는 논리연산자를 제공합니다. 연산자는 단락 평가를 수행하며 각각 첫 번째 0 인수와 non-nil 인수를 반환합니다.

 (또는 (그리고. 제로 제로 "절대") '제임스" '태스크 '시간) 

'제임스'로 평가하겠습니다

람다 식 및 함수 정의

또 다른 특별한 오퍼레이터,lambda는 변수를 식 내에서 평가되는 값에 바인드하기 위해 사용됩니다.이 연산자는 함수를 만드는 데도 사용됩니다.lambda는 인수 및 함수가 평가하는 식(복귀되는 값은 평가된 마지막 식)의 목록입니다.표현

 (람다 (arg) (+ arg 1)) 

적용되었을 때 하나의 인수를 사용하여 바인드하는 함수에 대해 평가합니다.arg이 인수보다 큰 숫자1을 반환합니다.람다 식은 명명된 함수와 동일하게 처리됩니다.따라서 이 표현은

 ((람다 (arg) (+ arg 1)) 5) 

까지 평가하다.6여기에서는 함수 어플리케이션을 실행하고 있습니다.값 5를 전달함으로써 익명 함수를 실행합니다.

명명된 함수는 디펀 매크로를 사용하여 람다 식을 심볼에 저장함으로써 생성됩니다.

 (삭제하다 후우 (a b c d) (+ a b c d)) 

(defun f (a) b...)라는 이름의 새로운 함수를 정의합니다.f글로벌 환경에서의 대응입니다.이는 개념적으로 다음과 같습니다.

 (설정 (funion 'f') #'(람다 (a) (블록 f b...))) 

어디에setf첫 번째 인수 값 설정에 사용되는 매크로입니다.fdefinition 'f새로운 함수 객체로 이동합니다. fdefinition라는 이름의 함수에 대한 글로벌 함수 정의입니다.f.#'의 줄임말입니다.function특수 연산자, 함수 개체를 반환합니다.

원자

원래 LISP에는 원자 및 목록이라는 두 가지 기본 데이터 유형이 있었습니다.리스트는 요소의 유한 순서 순서이며, 여기서 각 요소는 원자 또는 리스트이며, 원자는 숫자 또는 기호입니다.심볼은 본질적으로 고유한 이름 있는 항목으로, 소스 코드에서 영숫자 문자열로 작성되며, 변수 이름 또는 심볼 처리에서 데이터 항목으로 사용됩니다.예를 들어 리스트는(FOO (BAR 1) 2)에는 3가지 요소가 포함되어 있습니다.기호FOO, 리스트(BAR 1), 그리고 숫자 2.

원자와 목록의 본질적인 차이점은 원자는 불변하고 유일하다는 것이다.소스 코드의 서로 다른 위치에 나타나지만 정확히 동일한 방식으로 쓰여진 두 원자는 동일한 [citation needed]개체를 나타냈지만, 각 목록은 다른 목록과 독립적으로 변경될 수 있고 비교 연산자에 의해 다른 목록과 구별될 수 있는 개별 개체였다.

이후 리스프 방언에 더 많은 데이터 유형이 도입되고 프로그래밍 스타일이 진화하면서 원자의 개념은 중요성을 [citation needed]잃었습니다.많은 방언은 여전히 레거시 [citation needed]호환성을 위해 술어 아톰을 유지하며 단점이 아닌 모든 오브젝트에 대해 true로 정의했습니다.

동의 및 목록

목록 상자 및 포인트 다이어그램(42 69 613)

리스프 리스트는 단일 링크 [59]리스트로 구현됩니다.이 목록의 각 셀은 단점(Scheme에서는 )이라고 불리며, car와 cdr이라고 불리는 두 의 포인터로 구성됩니다.이것들은 각각에 상당합니다.data그리고.next문서 링크 목록에서 논의된 필드.

cons 셀로부터 구축될 수 있는 많은 데이터 구조 중 가장 기본적인 것 중 하나는 적절한 목록이라고 불립니다.적절한 리스트는 특별한 것 중 하나입니다.nil(빈 목록) 기호 또는 단점car기준(리스트와 같은 다른 cons 구조일 수 있음)을 가리키고,cdr다른 적절한 목록을 가리킵니다.

특정 단서가 링크 리스트의 선두로 간주될 경우 해당 차량은 목록의 첫 번째 요소를 가리키고 CDR은 목록의 나머지 요소를 가리킵니다.이 때문에,car그리고.cdr함수는 또한 불려진다.first그리고.rest(예를 들어 트리가 아닌) 링크된 목록의 일부인 동의서를 참조할 때.

따라서 Lisp 목록은 C++ 또는 Java 컨테이너 클래스의 인스턴스와 같이 원자 객체가 아닙니다.리스트는 링크된 동의의 집계에 지나지 않습니다.주어진 목록을 참조하는 변수는 목록의 첫 번째 단점을 가리키는 포인터일 뿐입니다.목록 트래버설은 목록을 cdring down(cdrs를 연속해서 사용하여 목록의 각 단원을 방문하거나 여러 상위 함수를 사용하여 목록 위에 함수를 매핑함으로써 수행할 수 있습니다.

동의와 목록은 Lisp 시스템에서 매우 보편적이기 때문에 Lisp의 유일한 데이터 구조라는 것은 일반적인 오해입니다.실제로 가장 단순한 Lisps를 제외한 모든 Lisps에는 벡터(어레이), 해시 테이블, 구조 등과 같은 다른 데이터 구조가 있습니다.

S 표현식은 리스트를 나타냅니다.

괄호로 묶인 S 표현식은 연결된 목록 구조를 나타냅니다.S 식과 같은 리스트를 나타내는 방법은 여러 가지가 있습니다.cons는 도트 쌍 표기로 다음과 같이 쓸 수 있습니다.(a . b),어디에a차랑bCDR을 클릭합니다.더 긴 적절한 목록이 작성될 수 있습니다.(a . (b . (c . (d . nil))))도트 포함 기호로 표시됩니다.이것은 통상적으로 다음과 같이 약칭된다.(a b c d)목록 표기로.부적절한[60] 리스트는, 다음의 2개의 조합으로 기술될 가능성이 있습니다.(a b c . d)마지막 CDR이 다음인 3명의 동의자 목록에 대해d(즉, 리스트(a . (b . (c . d)))(완전히 지정된 형식으로)

리스트 처리 절차

Lisp는 리스트에 액세스 및 제어하기 위한 많은 임베디드 절차를 제공합니다.목록을 직접 생성할 수 있습니다.listprocedure: 임의의 수의 인수를 사용하여 이러한 인수 목록을 반환합니다.

 (목록. 1 2 'a' 3)  ;출력: (1 2 a 3) 
 (목록. 1 '(2 3) 4)  ;출력: (1 (2 3) 4) 

리스트가 죄수 쌍으로 구성되는 방식 때문에cons프로시저를 사용하여 목록 맨 앞에 요소를 추가할 수 있습니다.주의:cons프로시저는 리스트의 구성 방법에 따라 리스트 인수를 처리하는 방법이 비대칭입니다.

 (단점 1 '(2 3))  ;출력: (1 2 3) 
 (단점 '(1 2) '(3 4))  ;출력: (1 2) 3 4) 

append 프로시저는 2개 이상의 목록을 서로 추가합니다.리스프 리스트는 링크 리스트이므로 2개의 리스트를 추가하면 점근적인 시간 O가 됩니다.{ O(

 (추가하다 '(1 2) '(3 4))  ;출력: (1 2 3 4 ) 
 (추가하다 '(1 2 3) '() '(a) '(5 6))  ;출력: (1 2 3 a 5 6 ) 

공유 구조

리스프 리스트는 단순한 링크 리스트이므로 서로 구조를 공유할 수 있습니다.즉, 2개의 리스트는 동일한 꼬리 또는 최종 결점 시퀀스를 가질 수 있습니다.예를 들어, 다음 공통 리스프 코드 실행 후:

(설정 후우 (목록. 'a' b. 'c')) (설정 막대기 (단점 'x' (CDR 후우))) 

리스트foo그리고.bar이다(a b c)그리고.(x b c)각각 다음과 같다.하지만 꼬리는(b c)는 양쪽 리스트의 같은 구조입니다.복사가 아닙니다.콘셀이 가리키는 것은b그리고.c두 목록의 동일한 메모리 위치에 있습니다.

복사가 아닌 구조를 공유하면 성능을 획기적으로 향상시킬 수 있습니다.그러나 이 기술은 인수로 전달된 목록을 변경하는 함수와 원치 않는 방식으로 상호 작용할 수 있습니다.1개의 리스트 변경(예를 들어 의 치환)c와 함께goose는, 다른 쪽에 영향을 줍니다.

 (설정 (셋째 후우) '오디오') 

이것은 변화합니다.foo로.(a b goose)단, 이에 따라 변경도 이루어집니다.bar로.(x b goose)– 예상치 못한 결과일 수 있습니다.이는 버그의 원인이 될 수 있으며, 그 인수를 변경하는 함수는 바로 이러한 이유로 파괴적인 것으로 문서화되어 있습니다.

기능 프로그래밍의 광팬들은 파괴적인 기능을 피한다.기능 스타일을 선호하는 Scheme(구성표) 방언에서 파괴 기능의 이름은 다음과 같은 경고 느낌표 또는 "쾅"으로 표시됩니다.set-car!(read set car bang), 이것은 죄수의 차를 대체한다.공통 리스프 방언에서는 파괴 기능이 일반적입니다.set-car!이름이 붙여졌다rplaca"교체차"를 선택합니다.그러나 Common Lisp에는 특별한 설비가 포함되어 있기 때문에 이 기능은 거의 볼 수 없습니다.setf를 사용하면 파괴 함수를 쉽게 정의하고 사용할 수 있습니다.Common Lisp에서 자주 사용되는 스타일은 프로토타이핑 시 기능적으로(파괴 콜 없이) 코드를 작성한 후 안전한 최적화로 파괴 콜을 추가하는 것입니다.

자체 평가 양식 및 견적

Lisp는 사용자가 입력한 식을 평가합니다.기호와 목록은 다른 (보통 더 단순한) 표현식에 대해 평가합니다. 예를 들어, 기호는 이름이 지정된 변수의 값에 따라 평가됩니다.(+ 2 3)까지 평가하다.5그러나 대부분의 다른 양식은 스스로 평가합니다.5Lisp로, 그것은 되돌아온다.5.

모든 식을 표시하여 평가되지 않도록 할 수도 있습니다(기호 및 리스트에 필요한 경우).이것이 바로 의 역할입니다.quote특수 연산자 또는 그 약자'(따옴표 1개).예를 들어, 일반적으로 기호를 입력하는 경우foo대응하는 변수의 값(또는 그러한 변수가 없는 경우는 에러)을 반환합니다.리터럴 기호를 참조하려면(quote foo)아니면 보통'foo.

공통 리스프와 스킴은 모두 백쿼트 연산자(스킴에서 준쿼트)를 지원하며,`character(악센트).이것은 식을 평가할 수 있고 쉼표로 따옴표로 따옴표로 따옴표로 그 값을 보간할 수 있다는 점을 제외하면 일반 따옴표와 거의 동일합니다., 따옴표를 떼고 쉼표로 묶다,@ 스플라이스 연산자변수가snue가치가 있다(bar baz)그리고나서`(foo ,snue)까지 평가하다.(foo (bar baz)),하는 동안에`(foo ,@snue)까지 평가하다.(foo bar baz)백쿼트는 매크로 [61][62]확장을 정의할 때 가장 많이 사용됩니다.

자기평가 형식과 인용 형식은 리스프의 리터럴과 동등합니다.프로그램 코드의 (변환 가능) 리터럴 값을 수정할 수 있습니다.예를 들어 함수가 따옴표로 묶인 형식을 반환하고 함수를 호출하는 코드가 형식을 수정하면 이후 호출 시 함수의 동작이 변경될 수 있습니다.

(삭제하다 피해야 할 ()   '(하나. 두명 세개))  (허락하다 ((물건 (피해야 할)))   (설정 (셋째 물건) '오디오'))   나쁘다!  (피해야 할)   ; 반환한다(12개 이상) 

이와 같이 따옴표로 묶인 형식을 수정하는 것은 일반적으로 잘못된 스타일로 간주되며 ANSI Common Lisp에 의해 잘못된 것으로 정의됩니다(파일 컴파일러가 유사한 상수를 병합하거나 쓰기 방지 메모리에 저장할 수 있기 때문에 컴파일된 파일에서 "정의되지 않은" 동작이 발생합니다).

리스프의 인용문의 공식화는 더글라스 호프스타터(Gödel, Escher, Bach)와 다른 사람들에 의해 자기 참조철학적인 아이디어의 한 예로서 언급되어 왔다.

범위 및 종료

Lisp 패밀리는 동적 또는 정적(어휘) 스코프사용에 대해 의견이 갈립니다.Clojure, Common Lisp 및 Scheme는 디폴트로 스태틱스코핑을 사용하지만 새로운 기능 탑재LISP, PicolispEmacsAutoCAD의 임베디드 언어는 동적 범위 지정을 사용합니다.버전 24.1 이후 Emacs에서는 다이내믹스코핑과 렉시컬스코핑이 모두 사용되고 있습니다.

프로그램 코드 목록 구조, 매크로 및 컴파일러에 의한 악용

리스프와 다른 언어의 근본적인 차이점은 리스프에서 프로그램의 텍스트 표현은 기본 리스프 시스템에서 사용되는 것과 동일한 내부 데이터 구조(링크된 목록, 기호, 숫자, 문자 등)를 단순히 사람이 읽을 수 있는 설명이라는 것입니다.

Lisp는 이를 사용하여 매우 강력한 매크로 시스템을 구현합니다.C 프리프로세서(C, Objective-CC++ 프로그래밍 언어용 매크로 프리프로세서)에 의해 정의되는 다른 매크로 언어와 마찬가지로 매크로에서는 컴파일 가능한 코드가 반환됩니다.단, C 프리프로세서 매크로와는 달리 매크로는 Lisp 함수이므로 Lisp의 모든 기능을 이용할 수 있습니다.

또, 리스트와 같은 구조를 가지는 리스프 코드이기 때문에, 그 언어의 리스트 처리 기능에 의해서 매크로를 구축할 수 있다.즉, Lisp가 데이터 구조에 할 수 있는 것은 무엇이든 Lisp 매크로가 코드화할 수 있습니다.이와는 대조적으로, 대부분의 다른 언어에서는 파서의 출력은 순전히 언어 구현의 내부이며 프로그래머에 의해 조작될 수 없습니다.

이 기능을 통해 언어 내에서 효율적인 언어를 쉽게 개발할 수 있습니다.예를 들어 공통 리스프 오브젝트 시스템은 매크로를 사용하여 언어 확장으로 깔끔하게 구현할 수 있습니다.즉, 응용 프로그램에 다른 상속 메커니즘이 필요한 경우 다른 개체 시스템을 사용할 수 있습니다.예를 들어 Java는 다중 상속을 지원하지 않으며 이를 추가하는 합리적인 방법이 없는 등 대부분의 다른 언어와는 매우 대조적입니다.

단순화된 Lisp 구현에서 이 목록 구조는 프로그램을 실행하기 위해 직접 해석됩니다. 함수는 말 그대로 인터프리터에 의해 실행되는 목록 구조의 일부입니다.그러나 대부분의 실질적인 Lisp 시스템에는 컴파일러도 포함되어 있습니다.컴파일러는 목록 구조를 기계 코드 또는 바이트 코드로 변환하여 실행합니다.이 코드는 C와 같은 기존 언어로 컴파일된 코드만큼 빠르게 실행할 수 있습니다.

매크로는 컴파일 단계 전에 확장되므로 몇 가지 흥미로운 옵션을 제공합니다.프로그램이 미리 계산된 테이블을 필요로 하는 경우 매크로가 컴파일 시 테이블을 생성할 수 있으므로 컴파일러는 테이블 출력만 필요하며 실행 시 테이블을 생성하기 위해 코드를 호출할 필요가 없습니다.일부 Lisp 구현에는 메커니즘이 있습니다.eval-when(매크로에 필요한 경우) 컴파일 시간 동안 코드가 존재하지만 내보낸 [63]모듈에는 존재하지 않습니다.

평가 및 평가판 읽기 루프

리스프 언어는 인터랙티브한 명령줄과 함께 사용되는 경우가 많습니다.이 명령줄은 통합 개발 환경(IDE)과 조합될 수 있습니다.사용자는 명령줄에서 식을 입력하거나 IDE에 Lisp 시스템으로 전송하도록 지시합니다.Lisp는 입력된 식을 읽고 평가하여 결과를 인쇄합니다. 때문에, Lisp 커맨드 라인은 Read-Eval-Print Loop(REPL; 읽기 평가 인쇄 루프)라고 불립니다.

REP의 기본 동작은 다음과 같습니다.이것은 인용이나 매크로와 같은 실제 리스프의 많은 요소를 생략한 단순한 기술입니다.

read함수는 텍스트 S 식을 입력으로 받아 들여 내부 데이터 구조로 해석합니다.예를 들어, 텍스트를 입력하면(+ 1 2)프롬프트에서read는 이를 3가지 요소를 가진 링크 목록으로 변환합니다.+, 숫자 1 및 숫자 2 입니다.이 리스트는 리스프 코드의 유효한 부분이기도 합니다.즉, 평가할 수 있습니다.이는 목록의 차량이 함수(추가 연산)를 명명하기 때문입니다.

주의:foo단일 기호로 읽힙니다. 123숫자 123으로 읽힐 거예요. "123"문자열"123"로 해석될 것입니다.

eval기능, 결과적으로 0개 이상의 다른 Lisp 데이터가 이 데이터를 평가한다.평가 해석을 의미하는 데 있다;일부 Lisp 시스템 네이티브 기계어에 표현을 가지고 있지 않다.그러나 해석으로 평가 설명하기: 간단하다.차는 function,을 임명하다. 목록을 평가하기 위해서.eval첫째, 그때 그 논쟁에 기능이 적용된다 각각의 주장은 cdr에 주어진 측정한다.이 경우 기능은 추가된 인수 목록에 적용하는.(1 2)답이 열린다3평가의 결과이다.

기호는foo기호 체의 값에 평가합니다.같은 문자열로 문자열"123" 같은 데이터 계산된다.그 목록(quote (1 2 3))목록(123)에 평가합니다.

그의 일이다.print기능은 사용자에게 출력을 나타내는 방법이다.다음과 같은 간단한 결과를 얻기 위해3이건 사소한 거야목록 구조의 일부에 대해 평가된 표현식은 다음을 요구합니다.print목록을 스크롤하여 S-표현으로 출력합니다.

Lisp REP 를 실장하려면 , 다음의 3 개의 기능과 무한 루프 기능만을 실장할 필요가 있습니다.(자연스럽게, 의 실장은eval또한 다음과 같은 모든 특수 연산자를 구현해야 하기 때문에 복잡해질 것입니다.if또는lambda이 경우 기본 리플리케이션은 한 줄의 코드입니다.(loop (print (eval (read)))).

Lisp REP는 일반적으로 입력 편집, 입력 이력, 오류 처리 및 디버거 인터페이스도 제공합니다.

리스프는 보통 열심히 평가된다.Common Lisp에서는 인수는 적용순서('가장 왼쪽 안쪽')로 평가되지만 Scheme에서는 인수의 순서가 정의되지 않아 컴파일러에 의한 최적화를 위한 여지를 남긴다.

제어 구조

리스프는 원래 제어 구조가 매우 적었지만, 언어의 진화 과정에서 더 많은 제어 구조가 추가되었다.(리스프의 원래 조건부 연산자,cond는 나중의 전조입니다.if-then-else구조).

Scheme 방언의 프로그래머들은 종종 테일 재귀로 루프를 표현합니다.Scheme의 학문적 컴퓨터 공학에서의 공통점은 일부 학생들이 꼬리 재귀가 리스프어로 반복을 쓰는 유일한, 혹은 가장 흔한 방법이라고 믿게 만들었지만, 이는 잘못된 것이다.자주 볼 수 있는 리스프 방언은 모두 Scheme's의 명령형 반복구조를 가지고 있다.do공통 리스프 콤플렉스에 루프하다loop표현.게다가 이것을 주관적인 것이 아니라 목적적인 것으로 하는 중요한 문제는, 스킴이 테일 콜의 처리에 대해 특정의 요건을 만들고 있기 때문에, 스킴에 대해서 테일 재귀의 사용이 일반적으로 권장되는 것은, 그 프랙티스가 언어 정의에 의해서 명시적으로 서포트되고 있기 때문이다.반면 ANSI Common Lisp에서는 테일콜 제거라고 불리는 최적화가 필요하지 않습니다[64].따라서, 테일 재귀 스타일이 보다 전통적인 반복 구조를 사용하기 위한 일상적인 대체물이라는 사실(예:do,dolist또는loop는 단순히 스타일적인 선호가 문제가 아니라 효율(Common Lisp에서의 명백한 테일콜이 단순한 점프로서 컴파일되지 않을 수 있기 때문에)과 프로그램의 정확성(테일 재귀로 인해 공통 리스프에서 스택 사용이 증가할 수 있으므로 스택 오버플로의 위험이 있기 때문에) 중 하나일 가능성이 있기 때문에 권장되지 않습니다[65].

일부 Lisp 제어 구조는 다른 언어의 구문 키워드에 해당하는 특수 연산자입니다.이러한 연산자를 사용하는 식은 함수 호출과 표면 외관은 같지만 인수가 반드시 평가되지 않거나 반복 표현의 경우 여러 번 평가될 수 있다는 점에서 다릅니다.

대부분의 다른 주요 프로그래밍 언어와 달리 리스프는 언어를 사용하여 제어 구조를 구현할 수 있습니다.몇 가지 제어 구조는 리스프 매크로로 구현되며, 그 구조를 알고 싶어하는 프로그래머에 의해 매크로로 확장될 수도 있습니다.

Common Lisp 및 Scheme에는 모두 로컬 이외의 제어 흐름용 연산자가 있습니다.이들 연산자의 차이는 두 방언의 가장 큰 차이 중 일부입니다.이 스킴은 다음 명령어를 사용하여 계속 재진행할 수 있습니다.call/cc프로시저를 사용하면 프로그램이 실행 중인 특정 위치를 저장(및 나중에 복원)할 수 있습니다.Common Lisp는 재진입 연속을 지원하지 않지만 이스케이프 연속을 처리하는 몇 가지 방법을 지원합니다.

종종 같은 알고리즘은 명령형 또는 함수형으로 리스프로 표현될 수 있습니다.위에서 설명한 바와 같이 Scheme는 테일 재귀와 연속을 사용하여 제어 흐름을 표현하는 기능 스타일을 선호하는 경향이 있습니다.하지만, 명령적인 스타일은 여전히 꽤 가능하다.많은 Lisp 프로그래머들이 선호하는 스타일은 C와 같은 구조화 언어에 익숙한 프로그래머들에게 더 친숙하게 보일 수 있지만 Schemers가 선호하는 스타일은 Haskell과 같은 순수 함수 언어와 더 유사합니다.

리스트 처리에 있어서의 리스프의 초기 유산으로, 시퀀스에서의 반복에 관한 고차 함수를 폭넓게 갖추고 있습니다.많은 경우 다른 언어(예:forLisp에서는 고차 함수를 사용하여 동일한 작업을 수행할 수 있습니다.(많은 기능 프로그래밍 언어에서도 마찬가지입니다.)

좋은 예는 Scheme에서 호출되는 함수입니다.map공통 리스프에서는mapcar. 함수와 하나 이상의 목록이 주어지면,mapcar는 함수를 순서대로 목록의 요소에 적용하여 결과를 새 목록으로 수집합니다.

 (맵카 #'+ '(1 2 3 4 5) '(10 20 30 40 50)) 

이것은, 다음과 같이 적용됩니다.+대응하는 리스트 요소의 각 쌍에 대해 기능하여 결과를 낳는다.(11 22 33 44 55).

다음으로 일반적인 리스프 코드의 예를 나타냅니다.

"Hello, World!" 기본 프로그램:

(인쇄물 "안녕, 월드!") 

리스프 구문은 자연스럽게 재귀에 적응합니다.재귀적으로 정의된 집합의 열거와 같은 수학적 문제는 이 표기법으로 표현하기 쉽습니다.예를 들어, 숫자의 요인을 평가하는 방법:

(삭제하다 요인 (n)     (한다면 (제로 n) 1         (* n (요인 (1- n))))) 

기반이 되는 Lisp 시스템이 테일 재귀를 최적화하는 경우 이전 버전보다 스택스페이스가 적게 사용됩니다.

(삭제하다 요인 (n 옵션 (액세스 1))     (한다면 (제로 n) 액세스         (요인 (1- n) (* 액세스 n)))) 

위의 예시와 공통 리스프를 사용하는 반복 버전을 비교합니다.loop매크로:

(삭제하다 요인 (n)     (고리 위해서 i 부터 1 로. n         위해서  = 1 그리고나서 (*  i)         마침내. (돌아가다 ))) 

다음 함수는 목록을 반전시킵니다.(Lisp의 내장 리버스 기능도 같은 기능을 합니다.

(삭제하다 -스위치 (목록.)     (허락하다 ((수익률))       (돌리스트 (e 목록.) (밀다 e 수익률))       수익률)) 

오브젝트 시스템

다음과 같은 다양한 객체 시스템과 모델이 Lisp 위에 구축되어 있습니다.

  • Common Lisp Object System(CLOC)은 ANSI Common Lisp에 필수적인 부분입니다.CLOS는 New Flavors와 CommonLOOPS에서 파생되었습니다.ANSI Common Lisp는 최초의 표준화된 객체 지향 프로그래밍 언어(1994, ANSI X3J13)였다.
  • ObjectLisp[66] 또는 ObjectLisp(Lisp Machines Incorporated 및 Macintosh Common Lisp 이전 버전에서 사용)
  • LISP 객체 지향 프로그래밍 시스템 및 최신 CommonLOOPS
  • MIT에서 제조된 플레이버와 그 후속 제품인 New Flavors(심볼릭스가 개발).
  • KR(Knowledge Representation의 줄임말)은 Common Lisp용 GUI 라이브러리인 Garnet의 기입을 지원하기 위해 개발된 제약 기반 객체 시스템입니다.
  • KEI(Knowledge Engineering Environment)는 UNITS라는 객체 시스템을 사용하여 추론[67] 엔진 및 진실 유지 시스템(ATMS)과 통합했습니다.

운영 체제

언어 기반 시스템을 포함한 여러 운영체제는 Lisp(Lisp 기능, 규칙, 메서드, 데이터 구조 사용 등)에 기반하거나 [68]다음과 같은 Lisp로 작성됩니다.

Symbolics에 의해 Open Obtities;[69]Medley(Interlisp로 작성됨)로 이름이 변경된 속(속)은 원래 Xerox최신 [70][71]Star 워크스테이션에서 실행되었던 그래픽 운영 체제 패밀리입니다.Mezano;[72] Interlisp;[73][74] Interlisp;ChrysaLisp,[75] Taos [76]개발자에 의한

「 」를 참조해 주세요.

레퍼런스

  1. ^ "Introduction". The Julia Manual. Read the Docs. Archived from the original on 2016-04-08. Retrieved 2016-12-10.
  2. ^ "Wolfram Language Q&A". Wolfram Research. Retrieved 2016-12-10.
  3. ^ Edwin D. Reilly (2003). Milestones in computer science and information technology. Greenwood Publishing Group. pp. 156–157. ISBN 978-1-57356-521-9.
  4. ^ "SICP: Foreword". Archived from the original on 2001-07-27. Lisp is a survivor, having been in use for about a quarter of a century. Among the active programming languages only Fortran has had a longer life.
  5. ^ "Conclusions". Archived from the original on 2014-04-03. Retrieved 2014-06-04.
  6. ^ Steele, Guy Lewis; Sussman, Gerald Jay (May 1978). "The Art of the Interpreter, or the Modularity Complex (Parts Zero, One, and Two), Part Zero, P. 4". MIT Libraries. hdl:1721.1/6094. Retrieved 2020-08-01.
  7. ^ "The Top Programming Languages in Artificial Intelligence". Artificial Intelligence. APRO. 24 June 2020. Archived from the original on 2020-10-30. Retrieved 2021-02-15.
  8. ^ Paul Graham. "Revenge of the Nerds". Retrieved 2013-03-14.
  9. ^ Chisnall, David (2011-01-12). Influential Programming Languages, Part 4: Lisp.
  10. ^ Jones, Robin; Maynard, Clive; Stewart, Ian (December 6, 2012). The Art of Lisp Programming. Springer Science & Business Media. p. 2. ISBN 9781447117193.
  11. ^ McCarthy, John. "Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I". Archived from the original on 2013-10-04. Retrieved 2006-10-13.
  12. ^ Smith, David Canfield. MLISP Users Manual (PDF). Retrieved 2006-10-13.
  13. ^ McCarthy, John (12 February 1979). "History of Lisp: Artificial Intelligence Laboratory" (PDF).
  14. ^ Stoyan, Herbert (1984-08-06). Early LISP history (1956–1959). LFP '84: Proceedings of the 1984 ACM Symposium on LISP and functional programming. Association for Computing Machinery. p. 307. doi:10.1145/800055.802047. Archived from the original on 2005-04-05.
  15. ^ McCarthy, John. "LISP prehistory - Summer 1956 through Summer 1958". Retrieved 2010-03-14.
  16. ^ Hart, Tim; Levin, Mike. "AI Memo 39-The new compiler" (PDF). Archived from the original (PDF) on 2020-12-13. Retrieved 2019-03-18.
  17. ^ McCarthy, John; Abrahams, Paul W.; Edwards, Daniel J.; Hart, Timothy P.; Levin, Michael I. (1985) [1962]. LISP 1.5 Programmer's Manual (PDF). 15th printing (2nd ed.). p. Preface.
  18. ^ PDP-6/PDP-10의 36비트 워드사이즈는 1개의 워드에 2개의 Lisp 18비트포인터가 있는 것의 유용성에 영향을 받았습니다.Peter J. Hurley (18 October 1990). "The History of TOPS or Life in the Fast ACs". Newsgroup: alt.folklore.computers. Usenet: 84950@tut.cis.ohio-state.edu. The PDP-6 project started in early 1963, as a 24-bit machine. It grew to 36 bits for LISP, a design goal.
  19. ^ Steele, Guy L.; Gabriel, Richard P. (January 1996), Bergin, Thomas J.; Gibson, Richard G. (eds.), "The evolution of Lisp", History of programming languages---II, New York, NY, USA: ACM, pp. 233–330, doi:10.1145/234286.1057818, ISBN 978-0-201-89502-5, retrieved 2022-07-25
  20. ^ 일반적인 리스프:(defun f (x) x)
    스킴:(define f (lambda (x) x))또는(define (f x) x)
  21. ^ 매카시, J.;브레이, R.;에드워즈, D;폭스, P.;Hodes, L.;Luckham, D;Maling K공원, D, 러셀, S(3월 1960년)."LISP 나는 Programmers 매뉴얼"(PDF).메사추세츠 주의 보스톤시:인공 지능 그룹, MIT. 계수 센터와 연구소.2010-07-17에 있는 원본(PDF)에서 Archived.{{ 들고 일기}}:Cite저널journal=( 도와 주)5월 11일 2010년 Accessed이 필요하다.
  22. ^ McCarthy, John; Abrahams, Paul W.; Edwards, Daniel J.; Hart, Timothy P.; Levin, Michael I. (1985) [1962]. LISP 1.5 Programmer's Manual (PDF) (2nd ed.). MIT Press. ISBN 0-262-13011-4.
  23. ^ Quam, Lynn H.; Diffle, Whitfield. Stanford LISP 1.6 Manual (PDF).
  24. ^ "Maclisp Reference Manual". March 3, 1979. Archived from the original on 2007-12-14.
  25. ^ Teitelman, Warren (1974). InterLisp Reference Manual (PDF). Archived from the original (PDF) on 2006-06-02. Retrieved 2006-08-19.
  26. ^ Outils de generation d'interfaces: Etat de l'art et 분류: H. El Mrabet
  27. ^ Gerald Jay Sussman & Guy Lewis Steele Jr. (December 1975). "Scheme: An Interpreter for Extended Lambda Calculus" (PDF). AI Memos. MIT AI Lab. AIM-349. Retrieved 23 December 2021.
  28. ^ Steele, Guy L., Jr. (1990). "Purpose". Common Lisp the Language (2nd ed.). ISBN 0-13-152414-3.
  29. ^ Kantrowitz, Mark; Margolin, Barry (20 February 1996). "History: Where did Lisp come from?". FAQ: Lisp Frequently Asked Questions 2/7.
  30. ^ "ISO/IEC 13816:1997". Iso.org. 2007-10-01. Retrieved 2013-11-15.
  31. ^ "ISO/IEC 13816:2007". Iso.org. 2013-10-30. Retrieved 2013-11-15.
  32. ^ "X3J13 Charter".
  33. ^ "The Road To Lisp Survey". Archived from the original on 2006-10-04. Retrieved 2006-10-13.
  34. ^ "Trends for the Future". Faqs.org. Archived from the original on 2013-06-03. Retrieved 2013-11-15.
  35. ^ Weinreb, Daniel. "Common Lisp Implementations: A Survey". Archived from the original on 2012-04-21. Retrieved 4 April 2012.
  36. ^ "LISP50@OOPSLA". Lisp50.org. Retrieved 2013-11-15.
  37. ^ 문서: 표준: R5RS. schemers.org (2012-01-11)2013-07-17에 회수.
  38. ^ "Why MIT now uses python instead of scheme for its undergraduate CS program". cemerick.com. March 24, 2009. Archived from the original on September 17, 2010. Retrieved November 10, 2013.
  39. ^ Broder, Evan (January 8, 2008). "The End of an Era". mitadmissions.org. Retrieved November 10, 2013.
  40. ^ "MIT EECS Undergraduate Programs". www.eecs.mit.edu. MIT Electrical Engineering & Computer Science. Retrieved 31 December 2018.
  41. ^ "MITx introductory Python course hits 1.2 million enrollments". MIT EECS. MIT Electrical Engineering & Computer Science. Retrieved 31 December 2018.
  42. ^ 1.1.2장 역사, ANSI CL 표준
  43. ^ [1] Classp는 C++와 상호 운용하는 일반적인 LISP 구현으로 네이티브 코드에 대한 JIT(Just-In-Time Compilation)에 LLVM을 사용합니다.
  44. ^ [2] "Armed Bear Common Lisp(ABCL)는 JVM에서 실행되는 인터프리터와 컴파일러를 모두 갖춘 공통 리스프 언어의 완전한 구현입니다."
  45. ^ [3] 2018-06-22 Wayback Machine 공통 리스프 구현: 설문 조사
  46. ^ [4] 적극적으로 개발된 공통 리스프 구현 비교
  47. ^ Clojure 컬렉션 상세보기, 2012-06-24
  48. ^ "Clojure rational". Retrieved 27 August 2019. Clojure is a Lisp not constrained by backwards compatibility
  49. ^ GIMP 2.4의 스크립트푸, 2009-10-29 취득
  50. ^ Librep at Sawfish Wikia, 2009-10-29 취득
  51. ^ "IEEE Scheme". IEEE 1178-1990 - IEEE Standard for the Scheme Programming Language. Retrieved 27 August 2019.
  52. ^ Paul Graham (May 2002). "What Made Lisp Different".
  53. ^ "LISP prehistory - Summer 1956 through Summer 1958". I invented conditional expressions in connection with a set of chess legal move routines I wrote in FORTRAN for the IBM 704 at M.I.T. during 1957–58 ... A paper defining conditional expressions and proposing their use in Algol was sent to the Communications of the ACM but was arbitrarily demoted to a letter to the editor, because it was very short.
  54. ^ "Meaning of 'Object-Oriented Programming' According to Dr. Alan Kay". 2003-07-23. I didn't understand the monster LISP idea of tangible metalanguage then, but got kind of close with ideas about extensible languages ... The second phase of this was to finally understand LISP and then using this understanding to make much nicer and smaller and more powerful and more late bound understructures ... OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I'm not aware of them.
  55. ^ Lieberman, Henry; Hewitt, Carl (June 1983), "A Real-Time Garbage Collector Based on the Lifetimes of Objects", Communications of the ACM, 26 (6): 419–429, CiteSeerX 10.1.1.4.8633, doi:10.1145/358141.358147, hdl:1721.1/6335, S2CID 14161480
  56. ^ Edsger W. Dijkstra (1972), The Humble Programmer (EWD 340) (ACM 튜링상 강연).
  57. ^ "A Look at Clojure and the Lisp Resurgence".
  58. ^ "The Jargon File - Lisp". Retrieved 2006-10-13.
  59. ^ Sebesta, Robert W. (2012). ""2.4 Functional Programming: LISP";"6.9 List Types";"15.4 The First Functional Programming Language: LISP"". Concepts of Programming Languages (print) (10th ed.). Boston, MA, USA: Addison-Wesley. pp. 47–52, 281–284, 677–680. ISBN 978-0-13-139531-2.
  60. ^ NB: 소위 "점선 목록"은 "부적절한 목록"의 한 종류일 뿐입니다.또 다른 종류는 콘센트 세포가 루프를 형성하는 "원형 리스트"입니다.일반적으로 이것은 #n=(...)을 사용하여 여러 개의 참조를 갖는 대상 cons 셀을 나타내며 #n#은 이 cons를 나타내는데 사용됩니다.예를 들어 (#1=(a) . #1#)은 통상 (a) a)로 인쇄되지만 (a) a) b의 재사용을 명확하게 한다. #1=(a. #1#)는 원형이기 때문에 통상적으로 인쇄할 수 없다.단, (a...)는 표시되지만 #1=에 의해 정의된 콘셀의 CDR 자체는 표시된다.
  61. ^ "CSE 341: Scheme: Quote, Quasiquote, and Metaprogramming". Cs.washington.edu. 1999-02-22. Retrieved 2013-11-15.
  62. ^ Alan Bawden Wayback Machine에서 2013-06-03년 리스프 준이동 아카이브
  63. ^ 평가 시간 - 일반적인 Lisp 확장.Gnu.org 를 참조해 주세요.2013-07-17에 회수.
  64. ^ 3.2.2.3 일반적Lisp HyperSpec의 의미적 제약
  65. ^ 4.3. 추상화 제어(재귀 vs.Kent Pitman and Peter Norvig의 Good Lisp 프로그래밍 스타일 튜토리얼, 1993년 8월.
  66. ^ 1986년 보브로 17페이지
  67. ^ Veitch, 페이지 108, 1988
  68. ^ Proven, Liam (29 March 2022). "The wild world of non-C operating systems". The Register. Retrieved 2022-02-02.
  69. ^ "Symbolics Open Genera 2.0". GitHub Internet Archive. 7 January 2020. Retrieved 2022-02-02.
  70. ^ "Interlisp.org Project". Interlisp.org. 15 March 2022. Retrieved 2022-02-02.
  71. ^ "Interlisp Medley". GitHub. March 2022. Retrieved 2022-02-02.
  72. ^ froggey (1 August 2021). "Mezzano". GitHub. Retrieved 2022-02-02.
  73. ^ Hartmann, Lukas F. (10 September 2015). "Interim". Interim-os. Retrieved 2022-02-02.
  74. ^ Hartmann, Lukas F. (11 June 2021). "Interim". GitHub. Retrieved 2022-02-02.
  75. ^ Hinsley, Chris (23 February 2022). "ChrysaLisp". GitHub. Retrieved 2022-02-02.
  76. ^ Smith, Tony (21 August 2013). "UK micro pioneer Chris Shelton: The mind behind the Nascom 1". The Register. Retrieved 2022-02-02.

추가 정보

외부 링크

역사
어소시에이션 및 회의
서적 및 튜토리얼
인터뷰
  • 미니애폴리스 미네소타 대학 찰스 배비지 연구소의 존 맥카시와의 구술 역사 인터뷰.매카시는 매사추세츠 공과대학에서 시분할 개발을 위한 자신의 역할에 대해 논의합니다.그는 또한 논리 기반 AI(LISP)와 로봇 공학 등 Advanced Research Projects Agency의 자금 지원을 받는 인공지능(AI) 분야에서의 자신의 작업에 대해서도 설명한다.
  • 리처드 P. 가브리엘 인터뷰 (팟캐스트)
자원.