繁体   English   中英

什么是“空”,“程序”? 和“符号?” 在下面的代码中意味着什么?

[英]What does 'null?', 'procedure?' and 'symbol?' mean in the following code?

我正在阅读以下文档,以在Python中实现Lisp解释器: http : //norvig.com/lispy.html

standard_env函数中,已定义了一个字典,用于将某些符号或变量映射到其相应的函数或值。 但是,我无法理解env词典中的以下条目:

env = {}
env.update({
    'equal?':  op.eq, 
    'list?':   lambda x: isinstance(x,list),
    'null?':   lambda x: x == [], 
    'number?': lambda x: isinstance(x, (int, float)),   
    'procedure?': callable,
    'symbol?': lambda x: isinstance(x, str),
})

什么是“?” 最后的关键是什么意思? 您能否提供一些使用这些条目的示例?

语法上? 只是Lisp标识符中允许的许多字符之一。 因此,它只是函数名称的一部分。

按照约定,函数名称以?结尾? 用于返回布尔值的函数。

具体equal? 检查其两个参数是否相等,是否为null? 检查其参数是否为空列表,其他所有参数均为类型检查,即检查其参数是否为给定类型。

您能否提供一些使用这些条目的示例?

返回布尔值的函数最常在ifcond条件下使用,因此您可能会看到这样的例子作为使用null?的函数的示例null?

(define (sum lst)
  (if (null? lst)
    0
    (+ (first lst) (sum (rest lst)))))

我对Lisp并不熟悉,但是看一下这些术语的定义,就好像它们被用来检查参数是什么,即“列表”? 映射到一个测试该参数是否为列表的函数,“过程?” 测试参数是否为过程(或至少是可调用的),是否为null? 测试一个空列表(也许这就是解释器中表示空值的方式),等等。

在大多数Lisp方言中,标识符(实际上是符号名称)可以包含标点符号,例如? (或!-

按照惯例,在Scheme中, 谓词名称(返回可测试布尔值的命名函数)的名称以?结尾? (例如list? ),并且副作用函数的名称以!结尾! (例如vector-set! ); 另请参见R5RSSICP

在Common Lisp中, 谓词名称通常以P结尾(例如listp

这些命名约定只是有用的约定。 您可以将函数命名为foo!bar?x即使它不是谓词也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM