2015-11-17 17 views
0

我想从列表中获取运算符,它将是一个过程而不是符号。计划获取运算符是一个列表中的过程

因此,例如让我说我想建立这个列表:'(- a 3)使用cons

如果我要把((car '(- a 3)) 5 3),它应该打印出2。但是,由于-在列表中,因此获取列表的car仍然是符号而不是实际的运算符。

这里的问题是我必须使用cons构建(- a 3)列表(并将其打印出来)。我的教授将在其前面添加car以及5 3,最后应打印出2

所以我目前有这个:(cons '- (cons 'a (cons '3 '()))),打印出(- a 3)

如果我添加了car5 3((car (cons '- (cons 'a (cons '3 '())))) 5 3),我收到一个错误,说not a procedure

有人可以提供一些指导?我不知道如何继续。

+0

您需要一个函数,给定一个符号,返回全局绑定到该符号的值。 – coredump

+0

Scheme中是否有这样的功能?我不允许自己做。 –

+1

报价阻止正常评估,在这里你想强制它。所以... eval – coredump

回答

2

然后使用:(cons - (cons 'a (cons 3 '())))。也就是说,不要引用-。这将使用-过程而不是符号。

> ((car (cons - (cons 'a (cons 3 '())))) 5 3) 
2 

这可以写成一个quasiquoted列表,作为简写:

> ((car `(,- a 3)) 5 3) 
2 

在quasiquoted数据,也就是说,使用反引号,而不是一个报价,任何东西前面的逗号不加引号。 (里面没有逗号的quasiquote与报价相同)

+1

谢谢!从来不知道quasiquotes,看起来非常有用。 –