Lisp解释器

来源:互联网 发布:润和软件 死人 编辑:程序博客网 时间:2024/05/16 16:13

Lisp解释器

根据我们所看到的,我们现在可以开始弄清楚Lisp解释器在命令评估一个列表时的功能。 首先,看看是否列表前有引号; 如果有的话,解释器只是给我们列表。 另一方面,如果没有引号,解释器查看列表中的第一个元素,并查看它是否有函数定义。 如果是有定义,解释器将执行函数定义中的指令。 否则,解释器将打印一条错误消息。这就是Lisp的工作原理。 简单。 我们在一分钟之内会增加复杂性,但这些是基本面。 当然,要编写Lisp程序,您需要知道如何编写函数定义并将其附加到名称,以及如何在不使自己或计算机混淆的情况下执行此操作。

复杂化
现在,第一个复杂化。除了列表之外,Lisp解释器还可以评估一个没有引用的符号,并且没有括号。 Lisp解释器将试图确定符号的值作为一个变量。这个情况在变量一节中有描述。 (请参阅变量Variables)

第二个复杂的事情发生是因为一些功能是不寻常的,不能以通常的方式工作。它们一般不叫special forms。它们被用来做special jobs,比如定义一个功能,而且不是很多。在接下来的几章中,你将会介绍几个更重要的特殊形式。

除了特殊形式外,还有宏。宏是Lisp中定义的一个构造,它与函数的不同之处在于它将Lisp表达式转换为另一个表达式,以替代原始表达式进行评估。 (请参阅Lisp宏。Lisp macro)

对于这个介绍来说,你不需要太担心某种特殊的形式,宏观或者普通的功能。例如,如果是一个特殊的形式(请参阅if),但何时是宏(请参阅Lisp宏Lisp macro)。在Emacs的早期版本中,defun是一个特殊的形式,但是现在它是一个宏(见defun)。它仍然以相同的方式表现。

最后的复杂情况是:如果Lisp解释器正在查看的函数不是一种特殊的形式,并且如果它是列表的一部分,那么Lisp解释器会查看列表中是否有一个列表。如果有一个内部列表,Lisp解释器首先计算出它应该对内部列表做什么,然后它在外部列表上工作。如果在内部列表中嵌入另一个列表,则首先在那个列表上工作,依此类推。它总是首先在最里面的列表上工作。解释器首先在最里面的列表上工作,以评估该列表的结果。结果可以被封闭的表达式使用。

否则,翻译从左到右,从一个表达式到另一个表达式。


字节编译
解释的另一个方面是:Lisp解释器能够解释两种实体:人类可读的代码,我们将专注于它;专门处理的代码,称为字节编译的代码,这是不可读的。 字节编译的代码比人类可读的代码运行得更快。通过运行诸如byte-compile-file之类的编译命令之一,可以将人类可读的代码转换为字节编译的代码。 字节编译代码通常存储在以.elc扩展名而不是.el扩展名结尾的文件中。 您将在emacs / lisp目录中看到两种文件; 要读取的文件是带有.el扩展名的文件。实际上,对于大多数您可能需要定制或扩展Emacs的东西,您不需要字节编译; 我不会在这里讨论这个话题。 请参阅字节编译Byte Compilation,了解字节编译的完整说明。


原创粉丝点击