evalの妥当な使いどころ


`eval`は強力過ぎるのでできるだけ使うな、とは良くいわれることですが、では、妥当な使いどころはどういう場合でしょうか。

私が思い付く限りでは、`quote`の逆操作として`eval`を利用するのは妥当かなと思います。

[code]

    (eval ''foo)
    → foo
    
[/code]

リスト操作でも可能ではありますが、

[code]

    (cadr ''foo)
    → foo 
    
[/code]

はちょっと気持ち悪いですし、妥当かなと。

他には、どういった例があるでしょうか。




簡易的な言語処理系の実行器としての用途に使えるということを考えたことはありますね。

パース結果をＳ式として組み立てて、 (ちょっと複雑な言語なら間に意味解析なども狭んで) 適当な名前空間で eval すればそのまま言語処理系になります。

外部からの入力を eval するのはセキュリティ上の問題になりやすいとは言われていますが、パース (と場合によっては意味解析)
の段階で正当性を検証済みならば問題になりませんし、有用な使い方だと思います。




簡易的な言語処理系の実行器としての用途に使えるということを考えたことはありますね。

パース結果をＳ式として組み立てて、 (ちょっと複雑な言語なら間に意味解析なども狭んで) 適当な名前空間で eval すればそのまま言語処理系になります。

外部からの入力を eval するのはセキュリティ上の問題になりやすいとは言われていますが、パース (と場合によっては意味解析)
の段階で正当性を検証済みならば問題になりませんし、有用な使い方だと思います。

