(println (hello))
и (println (my-eval "(hello)"))
- полностью идентичные утверждения - единственное отличие состоит в том, что вы еще больше запутаете ваш редактор. my-eval
НЕ сопоставимо с реальным eval
. Разница в том, что аргумент my-eval
должен быть строкой во время компиляции - следующие ошибки, потому что символ x
не может быть приведен к строке.
(def x "(hello)")
(my-eval x)
Это делает my-eval
совершенно бессмысленным - вы можете "вычислить" буквальную строку или вы можете удалить кавычки и my-eval
и иметь одинаково функциональный код (который ваш редактор поймет).
Real eval
, с другой стороны, пытается скомпилировать код во время выполнения. Здесь он завершается неудачно, потому что он запускается из пространства имен main
, а не из пространства hello
, как указал @Matthias Benkard.