clojure - Lisp 形式和 Lisp 表达式是一回事吗?

标签 clojure lisp scheme common-lisp

一些文献说“以下形式的第一个子形式......”或“评估一个形式......”而其他一些文献说“评估一个表达式......”,而且大多数文献似乎都使用两者条款。这两个术语可以互换吗?意思有区别吗?

最佳答案

总结

形式 是作为数据的 Lisp 代码。 表达式是作为文本的数据。

请参阅 Common Lisp 标准中的词汇表条目:

解释

在 Common Lisp 中,formexpression 有两种不同的含义,理解它们的区别很有用。

表单 是运行中的 Lisp 系统中的实际数据对象。该表单是 Lisp 评估器的有效输入。

EVAL采用一种形式作为参数。

语法是:

eval form => result*

EVAL 不获取 Lisp 表达式形式的文本输入。它得到形式。这是 Lisp 数据:数字、字符串、符号、作为列表的程序……

CL-USER 103 > (list '+ 1 2)
(+ 1 2)

上面构造了一个 Lisp 形式:这里是一个列表,符号 + 作为第一个元素,数字 1 和 2 作为下一个元素。 + 命名一个函数,两个数字是参数。所以这是一个有效的函数调用。

CL-USER 104 > (eval (list '+ 1 2))
3

上面将表单 (+ 1 2) 作为数据对象提供给 EVAL 并计算结果。我们无法直接看到表单 - 我们可以让 Lisp 系统为我们创建打印的表示形式。

表单实际上是作为数据对象的 Lisp 表达式。

这有点不寻常,因为大多数编程语言都是通过描述文本输入来定义的。 Common Lisp 描述了 EVAL 的数据输入。表单作为数据结构。

下面的代码在求值时创建了一个 Lisp 形式:

"foo"         ; strings evaluate to themselves

'foo          ; that evaluates to a symbol, which then denotes a variable

123

(list '+ 1 2) ; evaluates to a list, which describes a function call

'(+ 1 2)      ; evaluates to a list, which describes a function call

使用示例:

CL-USER 105 > (defparameter foo 42)
FOO

CL-USER 106 > (eval 'foo)
42

以下创建有效表单:

'(1 + 2)            ; Lisp expects prefix form

(list 1 '+ 2)       ; Lisp expects prefix form

'(defun foo 1 2)'   ; Lisp expects a parameter list as third element

例子:

CL-USER 107 > (eval '(1 + 2))

Error: Illegal argument in functor position: 1 in (1 + 2).

表达式 通常用于 Lisp 数据对象的文本版本——不一定是代码。表达式由 Lisp 阅读器读取并由 Lisp 打印机创建。

如果您在屏幕或一张纸上看到 Lisp 数据,那么它就是一个表达式。

(1 + 2)             ; is a valid expression in a text, `READ` can read it.

关于clojure - Lisp 形式和 Lisp 表达式是一回事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17206657/

相关文章:

loops - 无限循环重现

functional-programming - 使用标准映射函数处理列表中的成对连续元素?

lisp - scheme中lambda表达式的解释

list - 如何从 Racket 语言中给定索引处的列表中获取项目?

collections - 更好的收藏功能

使用 lein uberjar 构建的 Clojure 应用无法启动

Clojure。 HTTP流文件

lisp - 在 Linux 中安装 SBCL

list - 在 Scheme 中交换列表中的两个元素

scheme - 定义一个计算方阵迹的方案函数