Racket中列表中的表达式

时间:2014-05-13 13:42:09

标签: list racket

如果我有一个像(define lst '((,(car '(1 2)) (1 2)) (,(car '(3 4)) (3 4))) )这样的列表,我试着'评估'表达式(即取结果'((1 (1 2)) (3 (3 4)))),我获得了与我相同的列表。

我知道如果我使用(quoasiquote ((,(car '(1 2)) (1 2)) (,(car '(3 4)) (3 4)))我获得了我正在寻找的东西,但问题在于使用迭代方法执行,其中(我认为)我不能仅使用值,而不是一个清单。 (即仅采用quoasiquote表达式的第二部分)。

例如,如果我使用for/list而我(list-ref lst 0),我会'(,(car '(1 2)) (1 2))获取(,(car '(1 2)) (1 2)),以便在quoasiquote函数中使用{{1}}。

如何在列表中获取表达式并对其进行评估?

谢谢。

2 个答案:

答案 0 :(得分:0)

我非常有信心我们在这里有一个XY-problem因为你所描述的很不寻常。此外,我想象的唯一解决方案是使用eval,这再次显示您可能正朝着错误的方向前进。

但是这里有一点尝试我相信你想要的东西:

(define lst '((list (car '(1 2)) '(1 2))
              (list (car '(3 4)) '(3 4))))

(define-namespace-anchor nsa)
(define ns (namespace-anchor->namespace nsa))

(for/list ((i lst)) 
  (define e (eval i ns))
  (printf "evaluating ~a    to    ~a\n" i e)
  e)

将打印

evaluating (list (car '(1 2)) '(1 2))    to    (1 (1 2))
evaluating (list (car '(3 4)) '(3 4))    to    (3 (3 4))

并评估为

'((1 (1 2)) (3 (3 4)))

答案 1 :(得分:0)

因此,当你引用数据时,它就像一些流行的Algol方言中的单引号,如perl。例如print '$_';实际打印$ _而不是变量$ _表示的值。如果您使用双引号,则字符串中的变量将扩展为其值。

在Scheme中,我们(quote x)'x。由于它引用',因此其中任何内容都不会被评估。如果是`x,则与(quasiquote x)相同,则Scheme会查找,expression(与(unquote expression)相同)和,@expression(与{{1}相同})。这些报价表格是 NOT 程序,但是宏。它将您的静态代码转换为不同的静态代码。

所以(unquote-splicing expression)

Scheme真正做的是将其转换为(begin (define test 10) `((1 2) (3 ,(+ test 4)))) ; ==> ((1 2) (3 14)),而如果它是(list '(1 2) (list 3 (+ test 4))),它会转变为`((3 ,(+ test 4)) (1 2)),因为尾部可以是常量,但如果它需要有头部则不能一个评估的尾巴。

我从您那里得到的问题是,您认为可以存储文本并稍后将其展开为(cons (list 3 (+ test 4)) '((1 2))),但这不起作用,因为(let ((x '((1 2) (3 ,(+ test 4))))) `x)是一个宏,因此它将评估为x。并且quasiquote会评估为(let ((x '((1 2) (3 ,(+ test 4))))) `,x)