什么是撇号类型的方案

时间:2014-03-24 00:33:32

标签: scheme lisp

我有使用成员函数的条件:

(cond ((member '1' (some-function)) (display #t)) (else (display #f)))

它工作正常,但我仍然找不到答案:

1)'1'的类型是什么?

2)我有下一个表达式

  

(lambda(x)(= x 1))

如何转换为相同类型的“1”?

2 个答案:

答案 0 :(得分:5)

请注意cond表达式没有按照您的想法进行。真正发生的是:

(cond ((member '1 '(some-function))
       (display #t))
      (else
       (display #f)))

换句话说:引用了数字1,并且表达式'(some-function)被解释为单个元素列表,其中符号some-function是其唯一成员。关于第一个问题,这个表达式:

'1'

...在Scheme中无效 - 尝试在评估窗口中输入它,不会发生任何事情:第一个引用适用于数字1,第二个引用需要进一步输入,所以任何事情都是如此写完之后会被引用。 FYI双引号表示字符串,与许多其他语言一样:"1"。但引用表示引用的表达式,该表达式对其自身进行求值:

'1
=> 1

它只是简写:

(quote 1)
=> 1

在上面的表达式中不需要,一个数字已经评估为自己:

1
=> 1

现在,关于第二个问题,它没有意义,因为'1'不是一种类型,如上所述。

答案 1 :(得分:4)

'x(quote x)相同。 Scheme不会评估参数,因此它基本上是如何执行常量值的。这不是一个单引号,而是你的示例中引用的列表中有两个元素,如下所示:

(cond ((member '1 '(some-function)) (display #t)) (else (display #f)))

你永远不需要引用一个数字,因为它总是被评估为自己。 '11

相同