lisp vs scheme中的true和false null值

时间:2017-02-24 02:12:02

标签: scheme lisp

我想在我编写的方案程序中使用该函数但是我不确定要翻译T&函数内的值为零。 nn基本上可以在方案中写成'()吗?

(define (listword (lambda (word)
  (cond
    ((isvowel (car word)) (novowel word))
    (T (novowel word NIL))))))

3 个答案:

答案 0 :(得分:2)

为避免混淆,我将把Common Lisp作为传统'的典范。 Lisp并称之为“Lisp'下面,而不是Scheme:Scheme当然也是一个Lisp,但我想要输入更少。

Lisp和Scheme都使用了一个共同的约定,即只有一个区别的假对象,其他一切都是真的。在构建列表时,Lisp和Scheme都需要有一个特殊的“空列表”列表。元素也是独一无二的。然后Lisp选择惩罚,使空列表和false成为同一个对象:Scheme不会,并将它们视为不同。另外,Lisp为空列表对象提供名称,而Scheme不提供,并且Scheme也不会将空列表对象视为自我评估,而Lisp则如此。两种语言都提供了一个规范的真实对象,但是Lisp为它提供了一个名称,而Scheme则没有。在这两种语言中,真假对象都是自我评估的。

所以

(Common)Lisp:

  • 除了空列表外,所有对象都为真,() - (if () 1 2)评估为2;
  • 空列表是自我评估的 - (eq '() ())是真的;
  • 空列表是唯一的 - (eq () ())(eq () '())都是正确的,例如(eq () (cdr (list 1)));
  • 空列表的名称为NIL - (eq nil ())&等等;
  • 有一个规范的真实对象,其名称为T,其值为T;
  • 虽然可能存在争议,但我认为当你想谈论虚假时,最好使用NIL,而当你想谈论空列表时,最好使用()

方案:

  • 除了#f - (if #f 1 2)评估为2(if x 1 2)评估为1 x的特殊假对象时,所有对象均为true 1}}任何值都不是eq?#f;
  • #f正在进行自我评估 - (eq? #f '#f)为真;
  • #f是唯一的;
  • #f没有特殊名称,因为没有符号的值(这可能不是Scheme中的正确术语);
  • 有一个规范的真实对象#t,尽管所有对象都是#f以外的其他对象;
  • 有一个唯一的空列表对象() - 此对象与#f不同,不是自我评估且没有名称,因此(eq? #f '())是false,但(eq? '() '())为真,(eq? '() (cdr (list 1)))为真,(if '() 1 2)评估为1(eq? () 1)为错误。

免责声明:我对CL的了解比我对Scheme的了解要好。

答案 1 :(得分:2)

在Common Lisp中nil / 'nil / () / '()表示相同的值nil,它既是空列表又是一个假值。在Scheme中,它们是两个不同的值,'()表示空列表,#f表示false值。在翻译Common Lisp时,需要确定该值是表示假值还是空列表。在某些情况下,您将使用空列表作为布尔值,因此您需要执行(not (null? v)),其中CL只是v。原因是Scheme中只有#f为false,因此空列表是真值。 (if '() #t #f) ; ==> #t

在Common Lisp t中可以用#t替换,但在Scheme中,else中的cond等某些形式的特殊符号是惯用的方式替代术语。

答案 2 :(得分:0)

我猜您正在将一些Common Lisp代码翻译成Scheme。在Scheme中,T表达式末尾的cond可以替换为true,但惯用方法是使用elseNIL只是空列表'(),有时别名为null

另外,要小心你如何定义一个过程,你在第一行写了一个不正确的左括号 - 正确的方法是:

(define listword
  (lambda (word)
    ...))

或等效(也许更惯用):

(define (listword word)
  ...)