1)变量的新概念。在Lisp中,所有变量实际上都是指针。值是具有类型的变量,不是变量,分配或绑定变量意味着复制指针,而不是它们指向的指针。
(defun print-twice (it)
(print it)
(print it))
“它”是一个变量。它可以绑定到ANY值。没有限制,并且没有与变量关联的类型。如果调用该函数,则不需要复制参数。该变量类似于指针。它具有访问绑定到变量的值的方法。无需保留内存。调用函数时,我们可以传递任何数据对象:任何大小和任何类型。
数据对象有一个“类型”,可以查询所有数据对象的“类型”。
(type-of "abc") -> STRING
2)符号类型。符号与字符串的不同之处在于,您可以通过比较指针来测试是否相等。
符号是具有名称的数据对象。通常,该名称可用于查找对象:
|This is a Symbol|
this-is-also-a-symbol
(find-symbol "SIN") -> SIN
由于符号是真实的数据对象,因此我们可以测试它们是否是同一对象:
(eq 'sin 'cos) -> NIL
(eq 'sin 'sin) -> T
例如,这使我们可以编写带有符号的句子:
(defvar *sentence* '(mary called tom to tell him the price of the book))
现在我们可以计算句子中THE的数目:
(count 'the *sentence*) -> 2
在Common Lisp中,符号不仅具有名称,而且还可以具有值,函数,属性列表和包。因此,可以使用符号来命名变量或函数。属性列表通常用于向符号添加元数据。
3)使用符号树的代码符号。
Lisp使用其基本数据结构来表示代码。
列表(* 3 2)可以是数据,也可以是代码:
(eval '(* 3 (+ 2 5))) -> 21
(length '(* 3 (+ 2 5))) -> 3
那个树:
CL-USER 8 > (sdraw '(* 3 (+ 2 5)))
[*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
* 3 [*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
+ 2 5
4)整个语言始终可用。读取时间,编译时间和运行时之间没有真正的区别。您可以在读取时编译或运行代码,在编译时读取或运行代码,以及在运行时读取或编译代码。
Lisp提供以下功能:读取以从文本中读取数据和代码,加载以加载代码,EVAL评估代码,COMPILE以编译代码,PRINT以写入数据和代码为文本。
这些功能始终可用。他们不会消失。它们可以是任何程序的一部分。这意味着任何程序都可以始终读取,加载,评估或打印代码。
它们在诸如C或Java之类的语言中有何不同?
这些语言不提供符号,代码作为数据或数据的运行时评估作为代码。C语言中的数据对象通常是无类型的。
除了LISP家族语言之外,其他语言现在是否具有这些构造?
许多语言都具有其中一些功能。
区别:
在Lisp中,这些功能是为语言设计的,因此易于使用。