2017-02-24 47 views
0

我想在方案程序即时编写中使用该函数,但是im无法确定将函数内的Nil值翻译成何种值。基本上可以写成'()方案吗?lisp vs方案中的true和false null值

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

请注意,Scheme是_also_一个Lisp。 –

回答

0

我想你正在翻译Scheme的一些Common Lisp代码。在Scheme中,cond表达式末尾的T可以替换为true,但惯用的方法是使用else。而NIL仅仅是空列表'(),有时别名为null

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

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

或等价(也许更地道):

(define (listword word) 
    ...) 
1

为了避免混淆,我将把Common Lisp作为'传统'Lisp的典范,并将其称为'Lisp',而不是Scheme:Scheme当然也是Lisp,但我想输入less 。

Lisp和Scheme都使用常见约定,即存在一个具有其他所有内容为真的单个可区别的虚假对象。在列表的构建中,Lisp和Scheme都需要有一个特殊的高级“空列表”元素,这也是唯一的。然后,Lisp选择双关语,使空列表和false为同一个对象:Scheme不会,并将它们视为不同的对象。另外,Lisp为空列表对象提供名称,而Scheme不支持,而Scheme也不会将空列表对象视为Lisp执行时的自我评估。这两种语言都提供了一个规范的真实对象,但Lisp提供了一个名称,而Scheme没有。在这两种语言中,真假对象都是自我评价的。

所以。

(公用)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)评估为1x有任何值不eq?#f;
  • #f是自我评估 - (eq? #f '#f)是真的;
  • #f是独一无二的;
  • #f没有特殊名称,因为没有符号的价值(这可能不是Scheme中的正确术语);
  • 有一个规范的真实对象,#t,虽然所有对象都是真实的,但不是#f;
  • 有一个独特的空列表对象,() - 此对象是不一样的#f,是不是自我评估,并没有名字,所以(eq? #f '())是假的,但(eq? '() '())是真实的,因为是(eq? '() (cdr (list 1))),而(if '() 1 2)评估为1(eq?() 1)是错误。

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

1

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

Common Lisp中t可以通过#t被取代,但在方案有在cond一些形式像else是做替代长期惯用的方式特殊符号。

相关问题