问题如下,它可以在http://www.cs.indiana.edu/classes/b551-leak/scheme_practice.html中找到.
问题定义:编写一个函数cxr,它是Scheme中提供的car/cdr运算符的泛化.cxr应该取一串"a"和"d"表示要执行的car和cdr操作的序列,并返回一个能够执行该序列的函数.
因此(cxr"ad")相当于函数cadr.
((cxr "ad") '(i ii iii iv v vi vii)) ==> ii
(define sixth (cxr "addddd"))
(sixth '(i ii iii iv v vi vii)) ==> vi
Run Code Online (Sandbox Code Playgroud)
我的尝试:我使用string-append将cxr"ad"转换为字符串"cadr".[这很容易] ..现在我如何在"cadr"与cadr之间建立链接...我尝试了string->符号,但输出被引用,并且该函数从未被执行. - 那么有什么方法可以取消引用吗?!
真正的问题:如何解决这个问题?
更新:感谢所有人的回答.它们都是正确的,我甚至在发布问题之前就已经解决了这个问题.当输入是(cxr adddd)时,我主要是想找到一种实际调用caddddr的方法... Everbody和caddddr一样功能,但实际上并没有调用cadddr.
也就是说,如何使功能与cadr caddr等具有相同的命名类型.
更新:(我想我找到了解决方案,它如下 - 但正如下面所说,它不适用于更长的时间):
(define cxr
(lambda (ad l)
( (eval (string->symbol (string-append "c" ad "r"))) l)
)
)
Run Code Online (Sandbox Code Playgroud)
正如Mimisbrunnr指出的那样,这里的想法不是字符串附加,而是eval.首先,这对于a和d的较长序列不起作用.
相反,您希望编写一个使用字符串的函数,并通过逐字符分析字符串来返回函数.
在HtDP的说法中,在将字符串转换为列表之后,这可以作为"a"和"d"列表上的结构递归来完成.
为了使这更容易,您可以使用"string-> list".这存在于Racket中,我有一种模糊的感觉,它也是r5rs的一部分.