我想在方案程序即时编写中使用该函数,但是im无法确定将函数内的Nil值翻译成何种值。基本上可以写成'()方案吗?lisp vs方案中的true和false null值
(define (listword (lambda (word)
(cond
((isvowel (car word)) (novowel word))
(T (novowel word NIL))))))
我想在方案程序即时编写中使用该函数,但是im无法确定将函数内的Nil值翻译成何种值。基本上可以写成'()方案吗?lisp vs方案中的true和false null值
(define (listword (lambda (word)
(cond
((isvowel (car word)) (novowel word))
(T (novowel word NIL))))))
我想你正在翻译Scheme的一些Common Lisp代码。在Scheme中,cond
表达式末尾的T
可以替换为true
,但惯用的方法是使用else
。而NIL
仅仅是空列表'()
,有时别名为null
。
另外,要小心你如何定义一个过程,在第一行写了一个不正确的左括号 - 正确的方法是:
(define listword
(lambda (word)
...))
或等价(也许更地道):
(define (listword word)
...)
为了避免混淆,我将把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)
评估为1
为x
有任何值不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的了解要好。
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
是做替代长期惯用的方式特殊符号。
请注意,Scheme是_also_一个Lisp。 –