Как передать строку в качестве имени функции в схеме? [Динамическое построение имен функций в схеме]

Проблема заключается в следующем, она найдена в http://www.cs.indiana.edu/classes/b551- утечка/scheme_practice.html .

Определение проблемы: Напишите функцию cxr, которая является обобщением операторов 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

Моя попытка: Я преобразовал cxr "ad" в строку "cadr" с помощью добавления строки. [Это просто] .. Теперь, как я могу связать "кадр" с кадром... Я пробовал строку->символ, но вывод заключен в кавычки и откуда функция не выполняется. -- так есть ли способ раскавычить ?!

Реальный вопрос: как решить эту проблему?


ОБНОВЛЕНИЕ: Спасибо всем за эти ответы. Все они верны, и я решил это таким образом, прежде чем даже опубликовать вопрос. В основном я искал способ вызвать caddddr, когда ввод (cxr adddd) ... Все сделали ту же функциональность, что и caddddr, но на самом деле не вызывали cadddr.

То есть, как сделать функции с тем же типом именования, что и cadr caddr и т.д.


ОБНОВЛЕНИЕ: (я думаю, что нашел решение, и оно заключается в следующем, но, как сказано ниже, оно не работает для более длинных d):

(define cxr 
(lambda (ad l)
   ( (eval (string->symbol (string-append "c" ad "r")))   l)
)
)

5
задан AJed 14 March 2012 в 22:29
поделиться