問題は次のとおりで、http://www.cs.indiana.edu/classes/b551-leak/scheme_practice.htmlにあります。
問題定義: Scheme で提供されている car/cdr 演算子の一般化である関数 cxr を書きます。cxr は、実行される car および cdr 操作のシーケンスを表す "a" と "d" の文字列を取り、そのシーケンスを実行できる関数を返す必要があります。
したがって、(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
私の試み: string-append を使用して cxr "ad" を文字列 "cadr" に変換しました。[これは簡単です] .. "cadr" と cadr の間をどのようにリンクできますか... string->symbol を試しましたが、出力が引用符で囲まれているため、関数が実行されません。-- 引用符を外す方法はありますか?!
本当の質問: この問題を解決するにはどうすればよいですか?
更新:これらの回答に感謝します。それらはすべて正しいので、質問を投稿する前に実際にこの方法で解決しました。私は主に、入力が (cxr adddd) のときに caddddr を実際に呼び出す方法を探していました... Everbody は caddddr と同じ機能を実行しましたが、実際には cadddr を呼び出しませんでした。
つまり、cadr caddr などと同じネーミングタイプで関数を作る方法です。
更新:(私は解決策を見つけたと思いますが、それは次のとおりです-しかし、以下に示されているように、より長いdでは機能しません):
(define cxr
(lambda (ad l)
( (eval (string->symbol (string-append "c" ad "r"))) l)
)
)