Во-первых, в кложуре считается плохой идеей использовать не top-level дефайны. Во-вторых, макросы разворачиваются в компайл-тайме, когда никакой переменной 'х' еще не существует.
Короче, либо приведи более развернутый пример зачем тебе это нужно, либо начни с истоков и разберись что такое макросы.
Во-первых, в кложуре считается плохой идеей использовать не top-level дефайны. Во-вторых, макросы разворачиваются в компайл-тайме, когда никакой переменной 'х' еще не существует.
Короче, либо приведи более развернутый пример зачем тебе это нужно, либо начни с истоков и разберись что такое макросы.
Мда . . . Вы по моему все перепутали. Когда макрос разворачивается ему ни какая переменная «x» не нужна. Т.к. он не каких параметров не получает.
Так в кложуре то в топлевеле всё равно объявляются. Какой смысл? Это во-первых. Во вторых, что это за макрос такой? Он же не делает какую-либо форму, а просто должен возвращать x? Тогда нужно defn вместо defmacro. Пример вместо x - `(println ,x). Вот это будет форма, которую будет делать defmacro.
Имел в виду ~x и оно будет работать, но сейчас узнал, что в кложуре и ,x канает. В смысле, да, сам макрос не будет работать, это я форму привёл, но в квазицитировании в кложуре можно и , использовать.
Не существует она в компайл-тайме, т.к. создается в рантайме.
То есть в моем примере, в «компайл-тайме» переменной «x» не сущетсвует. ? И к чему это приводит? К тому что макрос не определяется или не раскрывается?
Я специально выложил простейший пример который выдает ошибку. Что-бы обсудить именно область видимости defmacro. А не возможности реализации того или иного функционала. Изначально функция должна была получать выражение clojure в виде строки и выполнять ее. Но вот беда, eval ни как ни хочет видеть локальные переменные. И я решил поэкспериментировать с defmacro.
У тебя запутанный пример. По докам defmacro то же, что и defn, но для макро, а defn это то же, что и def, но для функций, а def это объявление в топлевеле. А «выражение clojure в виде строки» мне это до конца не понятно. Парсить что ли?
Ну я и хочу убедиться, что надо это надо или надо так потому, что на самом деле надо по другому. Ты с заказчиком что ли ни разу не общался?
Общался. Если задача выполнима — делаю, если нет — выясняя зачем это надо.
А здесь задача более чем очевидна. Например, автору может быть нужно вычислять заданное пользователем математическое выражение с некоторыми программно подставленными аргументами. Самому такое пару раз требовалось.