27949


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

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

[code]

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

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

[code]

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

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

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


CC BY-SA 3.0
2016-07-29T13:21:07.167
27948
2016-07-30T12:54:20.597
3510
question
common-lisp lisp
evalの妥当な使いどころ


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

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

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


CC BY-SA 3.0
2016-07-29T13:38:54.770
27949
2016-07-29T13:38:54.770
3364
27948
answer


trivialですが、自前のreplを作る時。齊藤淳志さんの回答のサブセットとも言えます。


CC BY-SA 3.0
2016-07-30T00:45:28.623
27955
2016-07-30T00:45:28.623
5258
27948
answer


外部から読み込んだS式に対する`eval`は妥当である（というより使えないと困る）と思います。

[code]

    * (eval (read-from-string "(+ 1 2)"))
    
    3
    
[/code]


CC BY-SA 3.0
2016-07-30T02:41:05.243
27956
2016-07-30T04:07:24.860
2016-07-30T04:07:24.860
13199
13199
27948
answer


コード中ではありませんが、『On
Lisp』ではマクロのデバッグで`macroexpand-1`してもよくわからないとき、展開結果を`eval`してみるというケースが紹介されていました。

> Sometimes, though, the expansion will look fine and you'll want to evaluate
> it to see where the problems arise.  
>  [...]  
>  In the worst case you can set a variable to the list returned by
> macroexpand-1, then call eval on it:  
>  _(7.4 Testing Macroexpansion)_


CC BY-SA 3.0
2016-07-30T12:54:20.597
27971
2016-07-30T12:54:20.597
4010
27948
answer