Я обнаружил, что специальные формы нельзя передавать в качестве аргументов или сохранять в переменных, как в 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)
и в Racket/Scheme:
> (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
Это круто, меня это устраивает, я знаю, что могу просто написать функцию для обертывания специальной формы, а затем передать эту функцию.
Но я хотел бы знать, почему Лиспы имеют это ограничение, и какие негативные последствия это может иметь. Есть ли какие-либо основные диалекты, которые позволяют это?