在下面的代码中,"null?"、'procedure?' 和 'symbol?' 是什么意思?



我正在浏览以下文档,以便在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? 的函数示例:

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

熟悉Lisp,但是看看这些术语的定义,这看起来是用来检查参数是什么的,即"list?"映射到一个测试参数是否是列表的函数,"过程?"测试参数是否是一个过程(或至少是可调用的),"null?"测试空列表(也许这就是在解释器中表示nulls的方式), 等。

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

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

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

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

最新更新