Clojure では、特別なフォームを引数として渡すことも、変数に保存することもできないことがわかりました。
user=> (defn my-func
[op]
(op 1 2 3))
#'user/my-func
user=> (my-func +)
6
user=> (my-func if)
java.lang.Exception: Unable to resolve symbol: if in this context (NO_SOURCE_FILE:5)
user=> (def my-if if)
java.lang.Exception: Unable to resolve symbol: if in this context (NO_SOURCE_FILE:9)
ラケット/スキーム:
> (define (my-func op)
(op 1 2 3))
> (my-func +)
6
> (my-func if)
if: bad syntax in: if
> (define my-if if)
*if: bad syntax in: if
それはいいですね。特別なフォームをラップする関数を書いて、その関数を渡すことができることはわかっています。
しかし、Lisp にこの制限がある理由と、これを許可するとどのような悪影響があるかを知りたいです。それを可能にする主要な方言はありますか?