继续学习,借助于lispbox看一部分简单的lisp s表达式的常用方式。

258_基础的lisp S表达值小结_字符串

    先做了一个比较有意思的操作,我直接输入了一个中文的字符串,结果没有正常显示。错误信息我没有截取,提示的信息似乎是跟字体有关,使用的相应的unix某个字符集的一些编码符号覆盖不到中文。

258_基础的lisp S表达值小结_emacs_02

    一般的英文字符串是可以正常现实的,同时可以支持直接显示的还有一些数字。

258_基础的lisp S表达值小结_github_03

    进一步测试,作为关键字的foo可以进行自求值,结果是它自己。说实话,这个我一直没有用明白为什么。而直接输入foo提示错误,因为evaluation报错。也就是说REPL尝试去寻找foo的绑定失败了。在其他的编程语言中,更多的对此的描述是未定义。

258_基础的lisp S表达值小结_字符串_04

    上面增加了几个测试,首先是foo的定义。定义并赋值的foo变量,在REPL中直接找到了相应的绑定数值。而’,之前在emacs lisp中做过小结,是引用的意思。今天再次得到了一个是更好理解的解释,那么就是:引用函数意味着我们不去对他进行eval求值。同样的操作,对于foo和bar的两次引用操作,查看类型发现返回结果不同。这是为什么呢?这里,似乎看到了一个lisp有意思的功能了。其实,引用有时候是作为一个代码片段来起作用的!这一点,从foo的处理中就可以看得出来。上面的结果可以看出,foo被识别为一个symbol。而symbol在lisp中的作用是什么呢?就是用于给lisp的对象进行命名。

258_基础的lisp S表达值小结_github_05

    列表中的第一个元素会被当做是一个函数进行求值,而剩下的元素会被当做参数传递给函数。

258_基础的lisp S表达值小结_emacs_06

    作为一个lisp对象,在传递给函数之前会被进行求值,除非是引用。

258_基础的lisp S表达值小结_github_07

    再次测试了引用,同时测试了REPL中对于函数对象的处理。如果直接按照变量的模式进行输入,那么在REPL中无法被正确求值。如果是使用引用,求值出来的也只是一个symbol。如何进行相应对象的获取并求值呢?这里引入了一个#操作符,实现了这个功能。

258_基础的lisp S表达值小结_github_08

    还有一些类似if的特殊形式,其实这些并不是严格意义上的函数。这个在文档中可以找得到,其实通过简单的对比也能够看得出来。

258_基础的lisp S表达值小结_字符串_09

    从这里看,这两个标识符有着不同的意义,其中的一个是函数另一个不是。