Lisp 学习二

Form
在 Lisp 里,我们用单一的表示法,来表达所有的概念。

  • Lisp 使用前缀表达式

quote

  • 一个不遵守 Common Lisp 求值规则的操作符是 quote 。 quote 是一个特殊的操作符,意味着它自己有一套特别的求值规则。这个规则就是:什么也不做。 quote 操作符接受一个实参,并完封不动地返回它。
  • 为了方便起见,Common Lisp 定义 ' 作为 quote 的缩写。
  • Lisp 提供 quote 作为一种保护表达式不被求值的方式。

符号

  • 符号是英语的单词 (words)。无论你怎么输入,通常会被转换为大写。
  • 符号(通常)不对自身求值,所以要是想引用符号,应该像上例那样用 ' 引用它。
  • 引号保护了整个表达式(包含内部的子表达式)被求值。

列表

  • 列表是由被括号包住的零个或多个元素来表示。元素可以是任何类型,包含列表本身。使用列表必须要引用,不然 Lisp 会以为这是个函数调用。
  • 你可以调用 list 来创建列表。由于 list 是函数,所以它的实参会被求值。
  • Lisp的程序是用列表来表示的。
  • 空列表: 在 Common Lisp 里有两种方法来表示空列表。你可以用一对不包括任何东西的括号来表示,或用符号 nil 来表示空表。

列表 v.s. 表达式
TO BE..

cons
用函数 cons 来构造列表。如果传入的第二个实参是列表,则返回由两个实参所构成的新列表,新列表为第一个实参加上第二个实参。

car v.s. cdr
取出列表元素的基本函数是 car 和 cdr 。对列表取 car 返回第一个元素,而对列表取 cdr 返回第一个元素之后的所有元素

nil v.s. null v.s. not
在 Common Lisp 里,符号 t 是表示逻辑 真 的缺省值。与 nil 相同, t 也是对自身求值的。
逻辑 假 在 Common Lisp 里,用 nil ,即空表来表示。
nullnot 做的是一样的事情。

if
if 的最后一个实参是选择性的。如果忽略它的话,缺省值是 nil

and v.s. or
如果所有的实参都为 真 (即非 nil ),那么 and 会返回最后一个实参的值, 如果其中一个实参为 假 ,那之后的所有实参都不会被求值。 or 也是如此,只要碰到一个为 真 的实参,就停止对之后所有的实参求值。

符号 v.s. 变量
符号是变量的名字,符号本身就是以对象的方式存在。这也是为什么符号,必须像列表一样被引用。列表必须被引用,不然会被视为代码。符号必须要被引用,不然会被当作变量。

副作用

  • 副作用是指,表达式被求值后,对外部世界的状态做了某些改变。
  • 当我们想要写没有副作用的程序时,则定义多个表达式的函数主体就没有意义了。最后一个表达式的值,会被当成函数的返回值,而之前表达式的值都被舍弃了。如果这些表达式没有副作用,你没有任何理由告诉 Lisp ,为什么要去对它们求值。

函数式编程
函数式编程意味着撰写利用返回值而工作的程序,而不是修改东西。

尾递归
TO BE..

参考

ANS COMMON LISP: 第二章:欢迎来到 Lisp

猜你喜欢

转载自blog.csdn.net/weixin_33834075/article/details/86806440
今日推荐