Открих, че специалните форми не могат да се подават като аргументи или да се записват в променливи, както в 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
Това е страхотно, добре съм с това, знам, че мога просто да напиша функция, за да обвия специална форма и след това да предам тази функция.
Но бих искал да знам защо Lisps имат това ограничение и какви отрицателни последици би имало допускането на това. Има ли някакви големи диалекти, които позволяват това?