如何在方案中将字符串作为函数名传递?[Scheme中函数名称的动态构造]

AJe*_*Jed 5 scheme mit-scheme

问题如下,它可以在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)

Joh*_*nts 5

正如Mimisbrunnr指出的那样,这里的想法不是字符串附加,而是eval.首先,这对于a和d的较长序列不起作用.

相反,您希望编写一个使用字符串的函数,并通过逐字符分析字符串来返回函数.

在HtDP的说法中,在将字符串转换为列表之后,这可以作为"a"和"d"列表上的结构递归来完成.

为了使这更容易,您可以使用"string-> list".这存在于Racket中,我有一种模糊的感觉,它也是r5rs的一部分.