2016-05-19 3 views
3

Возможно ли переопределить поведение приложения-функции в Clojure?clojure: приложение функции переопределения

Например, я хотел бы сделать пространство имен, где:

(+ 2 2) 

Оценивает к постоянному 5 с помощью макроса, как:

(defmacro app [& args] 5) 
+0

Вы не указываете отношение между макросом 'app' и формой' (+ 2 2) '. Пожалуйста, уточните, что именно вы пытаетесь сделать. –

+0

Я бы хотел, чтобы макрос 'app' изменил поведение каждого приложения-функции в пространстве имен. Включая '(+ 2 2)', а также '(+ 1 2 3)' и '(f x)' для любой функции 'f'. –

ответ

2

+ это просто функция, так что вы можете, ваше пространство имен, исключите ссылку на clojure.core/+, а затем определите свою собственную функцию добавления в этом пространстве имен.

Clojure не предлагает общий крючок для концепции применения функций в этом пространстве имен. Что делают инструменты разработки, так это чтение пространства имен для всех символов, содержащих функции, а затем привязать их к функции обертки, которая выполняет трассировку. Это влияет только на функции, которые существуют в пространстве имен в то время, когда это происходит, поэтому оно менее общее, чем то, о чем вы просите.

см. clojure.tools.trace и Robert Hooke для получения более подробных примеров.

+1

Отлично, но могу ли я переопределить приложение? –

+0

Вы имеете в виду нечто иное, чем эффект вызова функции, когда вы говорите здесь приложение? Возможно, пример с желаемым выходом поможет мне понять. –

+1

Вы спрашиваете, можете ли вы повсюду изменять поведение всех вызовов функций? –

Смежные вопросы