2013-04-11 14 views
6

Przeglądałem src stringów? fn i miał kilka pytań. Poniżej jest źródłem string? fn -pytania dotyczące źródła ciągu znaków?

(def 
^{:arglists '([x]) 
    :doc "Return true if x is a String" 
    :added "1.0" 
    :static true} 
string? (fn ^:static string? [x] (instance? String x))) 
  1. Co dając fn statyczny metadane zrobić?
  2. Dlaczego metadane statyczne są podawane dwa razy, czy nie należy go określać dla fn lub dla var?
  3. Dlaczego anonimowy fn ma nazwę?
+3

1. Odpowiedź została udzielona tutaj: http://stackoverflow.com/questions/7552632/what-does-static-do-in-clojure –

Odpowiedz

4

Aby uzyskać odpowiedzi na pytania 1. i 2., zobacz komentarz d.j.sheldrick dotyczący pytania. Odpowiedź na 3 .:

Po pierwsze, chociaż nie ma tu znaczenia, nazwane funkcje mogą odnosić się do nich według ich nazwy. To pozwala im zwracać się jako wartości lub wywoływać się za pomocą zwykłego mechanizmu wywoływania, a nie na szczycie. Co ważne, jest to poprawna strategia auto-call dla funkcji generujących leniwe seqs; Poszedłem do powodów, dla których in an earlier SO answer (zobacz część po "Jak można zawijać wywołania rekursywne w leniwej sekwencji ...").

Po drugie, funkcje są kompilowane do klas JVM. Klasy są nazywane przez kompilator Clojure w oparciu o przestrzeń nazw, w której funkcja jest zdefiniowana, jeśli funkcja jest nienazwana; w przeciwnym razie nazwa jest używana do generowania bardziej znaczącej nazwy dla klasy. Jest to przydatne do debugowania, ponieważ sprawia, że ​​ślady stosu stają się bardziej zrozumiałe.

Powiązane problemy