Próbowałem dzisiaj ocenić wyrażenie Clojure z zagnieżdżonymi funkcjami stenograficznymi, ale nie pozwoliło mi to.
Wyrażenie brzmiało:
(#(+ % (#(+ % (* % %)) %)) 5) ; sorry for the eye bleed
Wynik był:
IllegalStateException Nested #()s are not allowed clojure.lang.LispReader$FnReader.invoke (LispReader.java:630)
...and a bunch of other garbage
functional-programming
syntax
clojure
functions
Lincoln Bergeson
źródło
źródło
Odpowiedzi:
Wiesz, że% należy do funkcji wewnętrznej. Wadą jest to, że utracisz dostęp do% w funkcji zewnętrznej.
fn [x]
Zamiast tego użyj składni.źródło
%
zewnętrznego fn, a w czasach, kiedy to robiłeś, mogłeś do niego wrócić(fn)
, prawda?Jest to całkowicie arbitralne; w parserze znajduje się kilka linii, które jawnie go wyłączają. Jeśli edytujesz tę linię, możesz zagnieżdżać anonimowe funkcje i działają one dokładnie tak, jak można się spodziewać.
w szczególności wiersze 634-635 w https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java
źródło
fn [x]
przepisanie kodu OP miałoby identyczną funkcjonalność jak zmodyfikowana wersja clojure. Ponadto, czy pojawiłby się problem z przenośnością kodu clojure?Możesz zagnieżdżać anonimowe funkcje (fn [params] (body)). Tylko składnia # nie obsługuje zagnieżdżania.
źródło