2011-09-26 21 views
31

Widziałem metadane ^:static dla kilku funkcji w kodzie źródłowym Clojure core.clj, np. w definicji seq?:Co robi "^: static" w Clojure?

(def 
^{:arglists '([x]) 
    :doc "Return true if x implements ISeq" 
    :added "1.0" 
    :static true} 
seq? (fn ^:static seq? [x] (instance? clojure.lang.ISeq x))) 

Co dokładnie ma to metadane zrobić i dlaczego kiedyś tak często w ciągu core.clj?

Odpowiedz

34

W rozwoju Clojure 1.3 Rich chcieli dodać zdolność do powrotu do funkcji innych niż typy Obiektu. Umożliwi to korzystanie z natywnych operatorów matematycznych bez konieczności wrzucania wszystkiego do jednej funkcji.

Pierwotna implementacja wymagała funkcji, które ją obsłużyły pod kątem oznaczenia :static. te metadane powodują, że kompilator tworzy dwie wersje funkcji, która zwróciła obiekt i jedną, która zwróciła ten określony typ. w przypadkach, w których kompilator ustalił, że typy zawsze będą pasowały do ​​bardziej specyficznej wersji.

Zostało to w pełni zautomatyzowane, więc nie musisz już tego dodawać.

+1

Kiedy mówisz * w pełni zautomatyzowany *, masz na myśli to, że w najnowszych wersjach kompilatora clojure tworzy bliźnięta i przeprowadza taką optymalizację * dla każdej funkcji * bez względu na to, czy jest^statyczne czy nie? –

+2

, gdy adnotacje typu powodują, że kompilator określa, że ​​dana funkcja może wytwarzać coś innego niż obiekt, wtedy inne formularze będą generowane. –

-3

Wydaje się, że jest to nowy atrybut metadanych w aplikacji clojure 1.3. I można porównać źródło między 1,3 a 1,2:

Więc myślę, że to ma coś wspólnego z ^: dynamiczna, która wskazuje, czy zmienna jest dozwolona dla dynamicznego wiązania . Tylko moje przypuszczenie. Nie jestem pewien, dopóki nie zobaczę dokumentu na temat tego atrybutu.