2010-12-18 15 views
11

Başka herhangi bir şeyin (ancak performans ayarlaması için zaman zaman yararlı bir iş getirmesi olabileceği beklentisiyle) daha fazla merak, Clojure makrolarını varolan bir işlevi "satır içi" olarak kullanmak mümkün mü? Ben gibi Yüklenenler kendimi inlined sanki tam olarak aynı işleviClojure makroları ile bir işlev belirtme

(defn my-function [a b] (+ a b)) 

(defn add-3-numbers [a b c] 
    (inline (my-function 
    a 
    (inline (my-function 
     b 
     c))))) 

Ve (derleme sırasında) üretmesi var:

yani ben böyle bir şey yapmak mümkün istiyorum

(defn add-3-numbers [a b c] 
    (+ a (+ b c))) 
+0

"Uygula" işlevine baktınız mı? http://clojuredocs.org/clojure_core/clojure.core/apply – edbond

+1

Geçerli çalışma zamanında dinamik olarak çalışır, derleme zamanında inlining yapan bir şey arıyorum .... – mikera

+0

'(read-string (clojure.repl/source-fn \ 'my-function))' iyi bir başlangıç ​​noktası gibi görünüyor! – vemv

cevap

14
bilmiyordun durumda

, kullanmakta satır içine fonksiyonlar tespit definline

(doc definline) 
------------------------- 
clojure.core/definline 
([name & decl]) 
Macro 
    Experimental - like defmacro, except defines a named function whose 
    body is the expansion, calls to which may be expanded inline as if 
    it were a macro. Cannot be used with variadic (&) args. 
nil 

da

(source definline) 
------------------------- 
(defmacro definline 
    [name & decl] 
    (let [[pre-args [args expr]] (split-with (comp not vector?) decl)] 
    `(do 
     (defn ~name [email protected] ~args ~(apply (eval (list `fn args expr)) args)) 
     (alter-meta! (var ~name) assoc :inline (fn ~name ~args ~expr)) 
     (var ~name)))) 

definline

sadece meta-veri {:inline (fn definition)} bir var tanımlayan kaynak kontrol. Yani, tam olarak ne soruyor olsanız da, var olanı, inline davranışa ulaşmak için yeni meta verilerle yeniden isimlendirebilirsiniz.

+0

kullanışlı bağlantı - bu pek çok durumda yardımcı bir araç gibi görünüyor. Aradığım şeylerle arasındaki temel fark, fonksiyonun açık bir şekilde satır içi olarak tanımlanmasını gerektiriyormuş gibi görünmekle birlikte, keyfi bir işlevi – mikera

+0

uygulayabilmeyi istedim, ancak bunu uygulamaya koymadım. potansiyel çözüm. Satır içi etiketini içeren meta veriler içeren işlevleri yeniden başlatan bir makro yazmayı deneyebilirsiniz. Çözülmesi gereken anahtar problem, yeniden işlemenin, çalışma zamanı yerine derleme zamanında yapılmasını sağlamaktır. – bmillare