我想在我编写的方案程序中使用该函数但是我不确定要翻译T&函数内的值为零。 nn基本上可以在方案中写成'()吗?
(define (listword (lambda (word)
(cond
((isvowel (car word)) (novowel word))
(T (novowel word NIL))))))
答案 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
,但惯用方法是使用else
。 NIL
只是空列表'()
,有时别名为null
。
另外,要小心你如何定义一个过程,你在第一行写了一个不正确的左括号 - 正确的方法是:
(define listword
(lambda (word)
...))
或等效(也许更惯用):
(define (listword word)
...)