Scheme - 防止列表的项目在定义上运行

时间:2013-11-05 22:49:17

标签: list scheme let

我在理解方案功能方面遇到一些麻烦,请看下面的代码:

(let
  ((a (list (< 10 30) (display "This message should never be printed"))))
  (not (car a)))

2个问题上升, A,为什么当我以这种方式定义a时,显示功能正在运行,即使我只是希望它是列表中的项目而不是“触发”它。 B,我该如何阻止它运行?

1 个答案:

答案 0 :(得分:1)

为防止评估,您需要引用:

(let ((a '((< 10 30) (display "This message should never be printed"))))
  (car a))

(let ((a '((< 10 30) (display "This message should never be printed"))))
  (cdr a))

产量

'(< 10 30)
'((display "This message should never be printed"))

如果您想稍后评估这些表达式,最简单的方法是将它们包装成lambda表达式:

(define a 
  (list 
   (lambda () (< 10 30))
   (lambda () (displayln "This message should never be printed"))))

(first a)
=> #<procedure>

((first a))
=> #t

(second a)
=> #<procedure>

((second a))
=> This message should never be printed