LISP
Lisp（歷史上拼寫為LISP），是具有悠久歷史的計算機編程語言家族，有獨特和完全用括號的前綴符號表示法。起源於1958年，是現今第二悠久而仍廣泛使用的高階編程語言。只有FORTRAN編程語言比它更早一年。Lisp編程語族已經演變出許多種方言。現代最著名的通用編程語種是Scheme、Common Lisp、Racket和Clojure。
Lisp最初創建時受到阿隆佐·邱奇的lambda演算的影響，用來作為計算機程序實用的數學表達。因為是早期的高階編程語言之一，它很快成為人工智能研究中最受歡迎的編程語言。在計算機科學領域，Lisp開創了許多先驅概念，包括：树结构、自動記憶體管理、动态类型、条件表达式、高階函數、遞迴、自主（self-hosting）編譯器、讀取﹣求值﹣輸出循環（REPL）。
"LISP"名稱源自「列表處理器」（）的縮寫。列表是Lisp的主要數據結構之一，Lisp編程代碼也同樣由列表組成。因此，Lisp程序可以把源代碼當作數據結構進行操作，而使用其中的宏系統，開發人員可將自己定義的新語法或領域專用的語言，嵌入在Lisp編程中。
代碼和數據的可互換性為Lisp提供了立即可辨識的語法。所有的Lisp程序代碼都寫為S-表達式或以括號表示的列表。函數調用或語義形式也同樣寫成列表，首先是函數或操作符的名稱，然後接著是一或多個參數：例如，取三個參數的函數codice_1即為。
1958年，約翰·麥卡錫在麻省理工學院發明了Lisp程式語言。1960年，他在《ACM通讯》發表論文，名為《遞迴函數的符號表達式以及由機器運算的方式，第一部》。在這篇論文中闡述了只要透過一些簡單的運算子，以及借鑒自阿隆佐·邱奇的用於匿名函數的表示法，就可以建立一個具圖靈完備性語言，可用於演算法中。
1955年至1956年間，資訊處理語言被創造出來用於人工智能。它首先使用的列表處理與遞歸概念被用於了Lisp。
麥卡錫最初使用M-表達式寫程式碼，之後再轉成S-表達式，舉例來說的語法，，等同於S-表達式的。然而由於S-表達式具備同像性，即程式與資料由同樣的結構儲存，實際應用中一般只使用S-表達式，而棄用M-表達式。M-表達式曾出現在短暫存在的Horace Enea的和的之中。
約翰·麥卡錫的學生史帝芬·羅素在閱讀完此論文後，認為Lisp編程語言當中的codice_2函数可以用機器碼來實做。他在IBM 704機器上，寫出了第一個Lisp解释器。1962年，Tim Hart與Mike Levin在麻省理工學院以Lisp編程語言，實做出第一個完整的Lisp編譯器。這兩人在筆記中使用的語法比麥卡錫早期的代碼更接近現代Lisp風格。
研究生Daniel Edwards在1962年之前開發的垃圾收集程序，使得在通用計算機上運行Lisp變得實用，但效率仍然是一個問題。在1963年，Timothy Hart提议向Lisp 1.5增加宏。
在1975年，蓋伊·史提爾二世和傑拉德·薩斯曼开发了Scheme，它是使用词法作用域和尾调用优化的第一个Lisp方言。在1980年代至1990年代期间，蓋伊·史提爾二世等人在将新的Lisp方言（多数是Maclisp的后继者比如ZetaLisp和NIL）统一成单一语言上进行了巨大的努力。新语言Common Lisp，在某种程度上兼容于它所替代的方言。在1994年，ANSI出版了Common Lisp标准《ANSI X3.226-1994信息技术编程语言Common Lisp》。此外还有嵌入到編輯器Emacs中的Emacs Lisp，它非常流行并建立了自己的标准。
自从创始以来，Lisp就密切联系于人工智能研究社群，特别是在PDP-10系统之上。在1970年傑拉德·薩斯曼和特里·威诺格拉德使用Lisp实现了编程语言，它被用在著名的AI系统SHRDLU之中。
在1970年代，随着AI研究催生了商业分支，使用当时的編譯器技術和硬體，实现出的Lisp系统的性能成为日益严重的问题。這導致了專用於運行Lisp環境和程序的Lisp機器的創建，隨着計算機硬體和編譯器技術的迅速發展，Lisp專用機器在1990年代早期被淘汰。
在它六十余年的历史中，Lisp产生了在S-表达式语言的核心主旨上的很多变体。此外，每个给定方言又可能有多种实现，例如Common Lisp就有十余种以上的实现。在一种标准化了的方言之内，符合标准的实现支持相同的核心语言，但是有着不同的扩展和函数库。
在方言间的差异可能是非常显眼的，例如定义一个函数，Common Lisp使用关键字codice_3，而Scheme使用codice_4。和在1998年的一篇论文中，按采用统一的还是分立的函数与值命名空间，将Lisp家族语言划分为Lisp和Lisp。在1990年代衰退之後，Lisp在2000年之後因一些關注而逐漸復甦。當其他人認為Lisp已經是過時陳舊的，如保羅·格雷厄姆和埃里克·雷蒙等人繼續出版有關於Lisp編程的著作，一些新的開發人員受到這些作者啟發，經常將Lisp這種語言描述為令人大開眼界的經驗，並聲稱在本質上比較其它編程語言更有生產效率。這種意識的提高可對比於，Lisp在1990年代中期“人工智能冬季”的那種短暫增長。
在2007年出現了Clojure，它是一个Lisp的新近方言，编译至Java虚拟机并特别关注并发性。現今與Lisp有關的大多數新活動，都集中在Scheme、Common Lisp、Emacs Lisp、Racket和Clojure的實作上，包括開發新的跨平台函式庫和應用。Dan Weinreb在他的2010年調查中，列出了11個積極維護中的Common Lisp實作。
開源社群建立了至今仍活躍的支援基礎：是個收集Common Lisp相關資訊的維基，Planet Lisp收集了各種Lisp相關博客的內容，Common-lisp.net是開源專案的託管站點。Quicklisp則是含括了許多函式庫的裝載管理器。
Lisp50@OOPSLA慶祝了Lisp的50週年（1958-2008）。在波士頓、溫哥華和漢堡，有定期的當地用戶會議。其他活動包括歐洲共同Lisp會議、歐洲Lisp專題討論會和國際Lisp研討會。
Scheme社群積極維護了二十多個實作。在2000年代開發了數個有意義的新實作（Chicken、Gambit、、、、），Scheme社群廣泛接納了RRS語言標準。Scheme實作需求過程建立了很多準標準函式庫和Scheme擴展功能。各種 Scheme實作的用戶社群持續地增長。一個新的語言標準化過程於2003年開始，並在2007年產生了RRS標準。使用Scheme介紹計算機科學課程的學校似乎有所減少，麻省理工學院的計算機科學入門課程，已經不再使用Scheme。
近年来又有了幾種新的Lisp方言：Arc、Hy、Liskell和。此外，是OS X上采用Lisp式语法的脚本语言；Chialisp是编译至CLVM的Chia区块链的链上编程环境。
在2019年10月，保羅·格雷厄姆发布了一个新的Lisp方言Bel。
Common Lisp和Scheme是Lisp发展的两大主流的代表。这些语言体现了显著不同的设计选择。
Common Lisp是Maclisp的后继者。对它有重要影响的是、Maclisp、、、和Scheme。它拥有Lisp Machine Lisp（用于编程Lisp机器的大型Lisp方言）的很多特征，但设计上能高效的实现在任何个人计算机或工作站上。Common Lisp是通用编程语言，因而拥有一个大型语言标准，包括很多内建数据类型、函数、宏和其他语言元素，以及一个对象系统（Common Lisp对象系统）。Common Lisp还从Scheme借鉴了特定特征，比如词法作用域和词法闭包。Common Lisp实现目标定为不同的平台，比如：LLVM、Java虚拟机、x86-64、PowerPC、Alpha、ARM、Motorola 68000和MIPS，和不同的操作系统，比如：Windows、macOS、Linux、Solaris、FreeBSD、NetBSD、OpenBSD、Dragonfly BSD和Heroku。
Scheme是一个静态作用域和正当尾递归的Lisp编程语言方言，由Guy L. Steele, Jr.和Gerald Jay Sussman发明。它的设计有着异常清晰和简单的语义，和很少的形成表达式的不同方式。它的设计大约比Common Lisp早上一个年代，Scheme是一个相当极简主义的设计。它拥有非常小的标准特征集合，但具有在Common Lisp中未规定的特定实现特征（比如尾递归优化和完全续体）。在Scheme中能方便的表达广阔的编程范型，包括指令式、函数式和消息传递风格。Scheme通过一系列的标准（第n次修订的算法语言Scheme报告）和一系列而持续的演化。
Clojure是Lisp的一个新近方言，其目标主要是Java虚拟机、通用语言运行库（CLR）和编译成JavaScript。它被设计为一个务实的通用编程语言。Clojure受到了Haskell的相当大的影响，因而非常强烈的强调了不可变性。Clojure提供了对Java框架和库的访问，具有可选的类型提示和类型推论，这样到Java的调用就可以避免反射并确使了快速的原始操作。Clojure设计上不后向兼容于其他Lisp方言。
进一步的，Lisp方言在很多应用中被用作脚本语言，其中最周知的是在Emacs编辑器中的Emacs Lisp，在AutoCAD中的AutoLISP和后来的Visual Lisp，Audacity中的，和LilyPond中GNU Guile。有用的Scheme解释器潜在的有更小大小，使得它特别流行于嵌入式脚本。例子包括SIOD和TinyScheme，二者都曾经以共用名字“Script-fu”成功的嵌入到了GIMP图像处理软件中。LIBREP是John Harper最初基于Emacs Lisp语言开发的Lisp解释器，它已经嵌入到了Sawfish窗口管理器。
Lisp有官方标准化和业界标准的方言：IEEE Scheme、ANSI Common Lisp、ISO ISLISP、RRS Scheme和RRS Scheme。
Lisp是一个。不同于多数其他语言，在表达式和语句之间不做区分。所有代码和数据都写为表达式。当求值一个表达式的时候，它产生一个值（在Common Lisp中可能有多个值），它可以接着被嵌入到其他表达式中。每个值都可以是任何数据类型的。
McCarthy的1958年论文介入两种类型的语法：符号表达式（S-表达式或sexps），它镜像了代码和数据的内部表示；和元表达式（），它表达S-表达式的函数。M-表达式从未得到青睐，几乎所有今天的Lisp都使用S-表达式来操纵代码和数据二者。
圆括号的使用是Lisp与其他编程语言家族最直接明显的差别。为此学生们一直将Lisp昵称为“迷失在愚蠢的括号中”（Lost In Stupid Parentheses）或“大量烦人的多余括号”（Lots of Irritating Superfluous Parentheses）。但是S-表达式语法也承担了Lisp多数能力：语法极其正规，利于计算机操纵。然而Lisp的语法不局限于传统的括号表示法。它可以扩展为包括替代表示法。例如，XMLisp是Common Lisp扩展，它采用元对象协议来集成S-表达式和可扩展标记语言（XML）。
有赖于表达式给予了语言巨大的灵活性。由于Lisp函数都写为列表，它们可以完全就像数据那样处理。这允许了轻易的书写能操纵其他程序的程序（元编程）。很多Lisp方言使用宏系统来利用这个特征，它确使了语言扩展而几乎没有限制。
书写Lisp列表，是以来分隔其元素，并包围以圆括号。例如，是其元素为三个原子、和的一个列表。这些值是隐含的有类型的：它们分别是两个整数和叫做“符号”的Lisp专有数据类型，但不需要显式的声明。
空列表也表示为特殊原子。这是Lisp中既是原子又是列表的唯一实体。
表示式被写为使用前缀表示法的列表。在列表中第一个元素是一个函数的名字、一个宏的名字、一个lambda表达式或特殊算符的名字（见后）。列表的余下部份是实际参数。例如，函数将它的实际参数作为一个列表返回，所以表达式：
求值为列表。在前面例子中的之前的codice_5是特殊算符，它不求值就返回它的实际参数。任何未引述的表达式，在外围表达式被求值之前，都递归的被求值。例如：
求值为列表。注意第三个实际参数是一个列表；列表是可以嵌套的。
对算术算符的对待都是类似的。表达式：
求值为codice_6。其在中缀表示法下的等价形式为""。
Lisp没有在Algol派生语言中实现的那样的算符概念。在Lisp中算术算符是可变参数函数（或多元函数），能够接受任何数目的实际参数。C-风格的codice_7增加算符，有时在名字codice_8之下实现，给出的语法是：
等价于codice_9，它返回codice_10的新值。
特殊算符（有时叫做特殊形式）提供了Lisp的控制结构。例如，特殊算符接受三个实际参数。如果第一个实际参数为非codice_11，它求值为第二实际参数；否则它求值为第三个实际参数。因此表达式：
求值为。当然，如果在的位置替换上非平凡的表达式会更有用处。
Lisp还提供逻辑算符codice_12、codice_13和codice_14。codice_12和codice_13算符进行短路求值，并分别返回它们的第一个codice_11或非codice_11实际参数：
会求值为codice_19。
另一个特殊算符，被用来绑定变量到值，接着对表达式求进行求值。这个算符还被用于建立函数：给的实际参数是一个形式参数列表，和这个函数要求值的一个或多个表达式，它的返回值是其求值的最后一个表达式的值。表达式：
求值为一个函数，它接受一个实际参数，绑定它到并返回比这个实际参数大一的数。对待Lambda表达式于命名函数没有区别；它们以相同方式调用。如下表达式：
求值为。这里我们做了一次函数应用：我们通过传递给它值codice_20而执行了这个匿名函数。
命名函数是通过使用codice_3宏，将一个lambda表达式存储在一个符号之中而建立的：
在全局环境中定义一个名为的新函数。它在概念上类似于表达式：
这里的是一个宏，用来设置第一个实际参数为一个新的函数对象。是对命名为的函数的全局函数定义。是特殊算符的简写，它返回一个函数对象。
Lisp家族按变量作用域分裂为两大支系，分别使用动态作用域，或使用静态（也叫做词法）作用域。Scheme、Common Lisp和Clojure缺省使用静态作用域，而AutoLISP、PicoLisp和newLISP使用动态作用域。Emacs Lisp自从Emacs版本24.1起使用动态和词法作用域二者。
在最初的LISP中，有两种基础数据类型：原子和列表。列表是元素的一个有限有序序列，这里的每个元素要么是一个原子要么是一个列表，而原子要么是一个数要么是一个符号。符号实质上是唯一性命名的项目，在源代码中写为字母数字串，并被要么用作一个变量名字要么中的一个数据项目。例如，列表包含三个元素：符号、列表和数codice_22。
在原子和列表之间的本质区别是原子是不可变的和唯一性的。出现在源代码中不同位置的两个原子，如果以完全相同方式写成则表示相同的对象，而每个列表都是一个分立的对象，它们可以独立于其他列表而改变 ，并可以通过比较算符而区分于其他列表。
随着后来的Lisp介入了更多的数据类型，和编程风格的演化，原子的概念失去了重要性。很多方言出于遗产兼容性而保留了谓词codice_23，定义它为对不是codice_24的任何对象都为真。
Lisp列表被实现为单向链表。这个链表的每个单元都叫做codice_25（在Scheme中叫做codice_26），它构成自两个指针，分别叫做codice_27和codice_27。
在众多可以用codice_24单元构建的数据结构中，最基本一个叫做“正当列表”（proper list）。正当列表要么是特殊的（空列表）符号，要么是一个codice_24，它的指向一个数据项（它可以是另一个codice_24结构比如一个列表），而指向另一个正当列表。
如果一个给定codice_24被接受为一个链表的头部，那么它的codice_33指向这个列表的第一个元素，而它的codice_34指向这个列表的余下部份。为此，在提及作为链表（而非树等）一部份的codice_24的时候，和函数也分别叫做和。
因此，Lisp列表不是原子对象，它们类似C++或Java中的容器类的实例。一个列表就是链接的codice_24的一个聚集。引用一个给定列表的变量，简单的就是到列表中第一个codice_24的指针。遍历一个列表可以通过逐一codice_34这个列表来进行，就是说连续的选取codice_34来访问这个列表的每个codice_24；或者通过使用任何一个将一个函数映射在一个列表之上的高阶函数。
由于codice_24和列表在Lisp系统中是普遍性的，经常有人误解它们是Lisp的唯一数据结构。事实上，除了最简单者之外的所有Lisp都有其他数据结构，比如向量（）、散列表、结构等等。
圆括号的S-表达式表示了链表结构。有多种方式将相同的列表表示为一个S-表达式。codice_24可以用“点对表示法”写为，这里的是codice_33而是codice_34。更长的正当列表可以用点对表示法写为。这通常简写为列表表示法的。一个非正当列表，可以用二者的组合来书写，比如列表有三个codice_24，最后的codice_34是（也就是完全特殊形式下的）。
Lisp提供很多内建的过程，用来访问和控制列表。列表可以直接用过程创建，它接受任何数目的实际参数，并返回这些实际参数的列表：
由于列表是从cons对构造而来，可以使用过程来在一个列表的前端增加一个元素。注意由于列表构造方法，在处理列表实际参数上是不对称的：
过程将两个（或更多）列表相互附加。由于Lisp列表是链表，附加两个列表有渐进时间复杂度 formula_1：
Lisp列表，作为单向链表，可以相互共享结构。就是说，两个列表可以有相同的尾部，或者最终的codice_24序列。例如，在执行下列Common Lisp代码之后：
列表和分别是和。然而，尾部在两个列表中都是相同的结构。它不是复件；对于两个列表指向和的codice_24单元都在相同的内存位置。
共享结构而非复制可以得到相当客观的性能提升。但是这种技术可能以未预期的方式，交互于改变作为实际参数传递给它的列表的那些函数。改变一个列表，比如替代为，将会影响另一个列表：
这变更为，但是从而还变更了为，这是可能是未预期的结果。这是缺陷的来源，为此改变它们的实际参数的那些函数被文档标示为破坏性（destructive）的。
函数式编程爱好者避免破坏性函数。在青睐函数式风格的Scheme方言中，破坏性函数的名字都标记了警告性感叹号，或者叫做“bang”，比如（读作set car bang），它替换一个codice_24的codice_33。在Common Lisp方言中，破坏性函数是司空见惯的，与等价的是，它的名字表示“replace car”。这个函数是不常见的，因为Common Lisp包括了一个特殊设施，用来轻易的定义和使用破坏性函数。在Common Lisp中常见的风格是在构建原型的时候写函数式代码（没有破坏性调用），接着将破坏性调用作为优化增加于可以安全的进行它们的地方。
Lisp求值用户录入的表达式。符号和列表求值为某个其他（通常更简单的）表达式，例如：一个符号求值为它指名的变量的值；求值为。但是，多数其他形式求值为其自身：如果录入到Lisp中，它返回。
任何表达式都可以标记上防止被求值（对于符号和列表是需要的）。这是特殊算符的角色，它也简写为（一个单引号）。例如，通常如果录入了符号，它返回对应变量的值（没有这个变量则为一个错误）。要引用这个符号，录入要么 ，要么更常见的。
Common Lisp和Scheme二者还支持“反引述”（backquote）算符（在Scheme中叫做），这时录入字符（重音符）。它几乎同于普通引述，除了它允许表达式被求值，并将它们的值插入到引述列表之中，这些表达式标记了逗号表示去引述，或逗号-at表示拼接算符。如果变量有值，则求值为，而求值为。反引述经常用于定义宏展开。
自求值形式和引述形式是Lisp中的等价者。在程序代码中可以修改（可变）文字的值。例如，如果一个函数返回一个引述形式，而调用这个函数的代码修改这个形式，这可以改变这个函数在后续调用时的行为：
像这样修改一个引述形式通常被认为是不良风格，并且被ANSI Common Lisp定义为是危险的。它会导致在编译文件中的未定义的行为，因为文件编译器可以合并类似的常量并将它们放置到写保护内存中，等等。
Lisp的引述形式化已经被Douglas Hofstadter（在《Gödel, Escher, Bach》中）和其他人注解为自引用的哲学想法的例子。
Lisp最初有很少的控制结构，但是在语言演化期间却增加了很多。Lisp的最初条件算符，是后来的结构的先驱。
Scheme方言的编程者经常使用尾递归表达循环。Scheme在学术计算机科学中的通行性，导致了一些学生相信尾递归是在Lisp中书写迭代的唯一的或最常用的方式，但是这是不正确的。所有常见的Lisp方言都有指令式风格的迭代构造，从Scheme的循环到Common Lisp的复杂的表达式。此外，使得这成为客观上而非主观上的一件事的关键要点，是Scheme对尾递归的处理提出了特殊要求，Scheme通常鼓励使用尾递归的原因，是语言定义明确的支持了这种实践。与之相反，ANSI Common Lisp不要求常称为尾递归消除的这种优化。因此，不鼓励将尾递归风格作为使用更传统的迭代构造（比如、或）的替代品。在Common Lisp中不只是风格偏好的问题，而是潜在的效率问题，因为在Common Lisp中明显的尾递归可能未被编译为简单的codice_51；和程序正确性问题，因为在Common Lisp中尾递归可能增加栈的使用而有堆栈溢出风险。
一些Lisp控制构造是特殊算符，等价于其他语言的语法关键字。使用这些算符的表达式与函数调用有着相同的表面外观，但是不同之处在于参数不是必须求值的，或者在迭代表达式的情况下，可以被求值多于一次。
对比于多数其他主要编程语言，Lisp允许使用语言自身实现控制结构。一些控制结构被实现为Lisp宏，想知道它们是如何工作的编程者甚至可以通过宏展开来研究。
Common Lisp和Scheme二者都有非局部控制流程算符。在这些算符中的不同是在这两种方言之间最深的差异。Scheme使用过程支持可重入的续体，它允许一个程序保存（并在将来恢复）执行中的特定位置。Common Lisp不支持可重入的续体，但是支持处理逃脱续体的一些方式。
相同的算法在Lisp中经常可以用要么指令式要么函数式风格来表达。如上所述，Scheme趋于青睐函数式风格，使用尾递归和续体来表达控制流程。但是，指令式风格仍是很有可能的。很多Common Lisp编程者偏好的风格，可能让使用结构化编程语言比如C的编程者看着更加熟悉，而Scheme编程者偏好的风格更加密切类似于纯函数式编程语言比如Haskell。
由于Lisp在列表处理上的早期遗产，它拥有与在序列上迭代有关的一组广泛的高阶函数。在其他语言中需要显式循环（比如C中的循环）的很多情况下，在Lisp和很多函数式编程语言中，相同的任务可以通过高阶函数来完成。
一个好的例子是在Scheme中叫做而在Common Lisp中叫做的函数。给定一个函数和一个或多个列表，依次这个列表的元素之上连续的应用这个函数，并将结果收集入一个新的列表：
这个codice_52函数将函数应用于每个对应的元素对之上，产生结果。
在Lisp和其他语言之间的基本区别是，在Lisp中一个程序的文本表示，简单的是人类可读的描述，它同于底层Lisp系统使用的内部数据结构（链表、符号、数、字符等)。
Lisp利用这一点来实现了一个非常强力的宏系统。就像其他宏语言比如C，一个宏返回可以接着被编译的代码。但是不同于C的宏，Lisp的宏是函数因而可以利用Lisp的全部能力。
进一步的，因为Lisp代码作为列表有着相同的结构，宏可以使用语言中任何列表处理函数来建造。简要的说，Lisp可以在数据结构上做的任何事情，Lisp宏都可以在代码上做。相反的，在多数其他语言中，解析器的输出是纯粹的内部于语言实现的而不能被编程者操纵。
这个特征可以在语言中开发高效语言。例如，Common Lisp对象系统可以使用宏清晰的实现为一个语言扩展。这意味着如果一个应用需要不同的继承机制，它可以使用不同的对象系统。这直接的对立于多数其他语言；例如，Java不能支持多重继承并且没有增加它的合理方式。
在简单的Lisp实现中，这个列表结构被直接的解释来运行这个程序；一个函数是在文字上的一段列表结构，它被解释器在执行它的时候遍历。但是，多数后来的Lisp系统还包括一个编译器。编译器将列表结构转换成机器代码或字节码用于执行。这个代码可以像用常规语言比如C编译的代码一样快速。
宏在编译步骤之前展开，因而提供一些有价值的选项。如果一个程序需要一个预先计算了的表格，那么一个宏可以在编译时间建立这个表格，所以编译器只需要输出这个表格，而不需要在运行时间调用代码来建立这个表格。一些Lisp实现甚至拥有一种codice_53机制，允许代码在编译时间期间出现（在一个宏需要它的时候），而不出现在发行的模块中。
Lisp语言经常被以交互式命令行来使用，它还可以结合入集成开发环境（IDE）。用户在命令行录入表达式，或指示IDE将它们传送给Lisp系统。Lisp读取录入的表达式，求值它们，并打印结果。为此，Lisp命令行被叫做读取﹣求值﹣输出循环（REPL）。
REPL的基本操作描述如下。这是一个简化的描述，省略了很多真实Lisp的元素，比如引述和宏。
函数接受文本的S-表达式作为输入，并将它们解析为内部数据结构。例如，如果你在提示符下录入文本，将它转换成有三个元素的一个链表：符号、数codice_54和数codice_22。恰巧这个列表也是一段有效的Lisp代码，就是说它是可以被求值的。这是因为codice_33这个列表指名了一个函数即加法运算。
注意将被读作一个单一符号。将被读作数一百二十三。将被读作字符串codice_57。
函数求值数据，返回零或多个其他Lisp数据作为结果。求值不必然意味着解释；一些Lisp系统编译所有的表达式为机器代码。但将求值描述为解释是很简单的：要求值其codice_33指名一个函数的一个列表，首先求值在它的codice_34中的每个实际参数，接着应用这个函数于这些实际参数。在这个案例中，这个函数是加法，而应用它于实际参数列表产生答案。这是这个求值的结果。
符号求值为符号codice_60的值。数据比如字符串codice_57求值为相同的字符串。列表求值为列表codice_62。
函数的工作是将输入表示给用户。对于简单结果比如这是平凡的。求值为一段列表结构的一个表达式会要求遍历这个列表并将结果输出为一个S-表达式。
要实现一个Lisp REPL，必需的只是实现这三个函数和一个无限循环函数。实现函数会很复杂是自然的，因为它必须也要实现所有特殊算符比如或。它们完成后，一个基本的REPL就是一行代码：。
Lisp REPL典型的也提供输入编辑、输入历史、错误处理和到调试器的接口。
Lisp通常使用及早求值。在Common Lisp中，实际参数以应用式次序（最左最内为先）求值，而在Scheme中实际参数的次序是未定义的，为编译器优化留下了余地。
Paul Graham从John McCarthy的最初论文中提炼出如下7个原始运算，示例采用的Common Lisp实现是SBCL： codice_63返回codice_10，我们简记为codice_65： A A (A B C)
將codice_5寫成codice_67只是一種語法糖。
codice_68当codice_10是一个codice_23或者空的codice_71时返回原子codice_72，否则返回codice_73。在Common Lisp中我们习惯用原子codice_72列表示真，而用空列表codice_75或codice_73列表示假。例如：
T NIL T
现在我们有了第一个需要求出实际参数值的算符，让我们来看看codice_5算符的作用——通过引述一个列表，我们避免它被求值（codice_2）。一个未被引述的列表达式作为实际参数，codice_23将其视为代码，例如：
T
这是因为codice_80已求值出结果codice_72，把它代入codice_82，成为codice_83，从而这个列表达式的结果是codice_72。
反之一个被引述的列表仅仅被视为列表，例如：
NIL
引用看上去有些奇怪，因为你很难在其它语言中找到类似的概念，但正是这一特征构成了Lisp最为与众不同的特点：代码和数据使用相同的结构来列表示，只用codice_5来区分它们。
codice_86当codice_10和codice_88指向相同的对象的时候返回codice_72，否则返回codice_73，例如：
T NIL T NIL
值得注意的是在Common Lisp中，原子对象在内存中只会有一份拷贝，所以codice_91返回codice_72。
codice_93要求codice_10是一个列表，它返回codice_10中的第一个元素，例如：
A codice_96同样要求codice_10是一个列表，它返回codice_10中除第一个元素之外的所有元素组成的列表，例如：
(B C) codice_99预期codice_88的值是一个列表，并且返回包含codice_10的值和随后codice_88的值的那些元素的一个列表，例如：
(A . B) (A B . C) (A B) (A B C) codice_103的求值规则如下：对“条件列表达式codice_104”依次求值，直到有一个返回codice_72。如果能找到这样的codice_104列表达式，相应的“结果列表达式codice_107”的值，作为整个codice_108列表达式的返回值。例如： SECOND 这个Hello World!例子展示Lisp的三种主要方言，在基本输出和函数定义上的用法： Lisp语法自然的适合于递归。数学问题比如递归定义集合的枚举，在这种表示法中表达是很容易的。例如，要求值一个数的阶乘：
下面的版本在底层Lisp系统进行尾递归优化时比前面版本取用更少的堆栈空间：
对比上述例子，下面的指令式版本使用了Common Lisp的宏：
下列函数反转一个列表。它与Lisp内建的codice_109函数做同样的事情：
已经有各种对象系统和模型建造在Lisp之上、旁边或其中，包括：