Clojure: Как создать функцию во времени выполнения

Я думаю , проблема Python является большой.

Это не об изучении Python (синтаксис), но представляет Вас маленькие и забавные загадки. Решение загадок основано на Python, но можно использовать любые соответствия (калькулятор, сценарии удара, Perl...). После решения один Вы добираетесь, чтобы видеть, как другие решили его и могут обсудить профессионалов & недостатки различных путей.

Очень хороший для получения ощущения того, как вещи могли быть сделаны ( умный ) в Python. Этот сайт работает особенно хорошо, если Вы знаете немного о других языках сценариев или командной строке, и т.д.

7
задан GabiMe 1 December 2009 в 09:15
поделиться

2 ответа

(defn gen-fn
  [n as b]
  (let [n        (symbol n)
        as       (vec (map symbol as))
        fn-value (eval `(fn ~n ~as ~b))]
    (intern *ns* n fn-value)))

И кое-что используют:

user=> (gen-fn "foo" ["x"] '(do (println x) (println (inc x))))
#'user/foo
user=> (foo 5)
5
6
nil

Однако мне этот подход не очень нравится. Очень плохо пахнет: eval . Почему вы хотите создавать глобальные объекты во время выполнения? Я вижу различные проблемы с неправильными пространствами имен и прочую уродливую икоту, поднимающуюся на горизонте ...

12
ответ дан 6 December 2019 в 19:37
поделиться

Я не совсем уверен, но считаю, что вы могли бы сделать это с помощью макроса, который был бы лучше eval.

(defmacro gen-fn
  [n as b]
  (let [n  (symbol n)
        as (vec (map symbol as))]
    `(intern *ns* n (fn ~n ~as ~@b))))
0
ответ дан 6 December 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: