Perché non possiamo scrivere le funzioni di stenografia annidata in Clojure?

11

Ho provato a valutare un'espressione Clojure con funzioni di stenografia nidificata oggi, e non me lo permetteva.

L'espressione era:

(#(+ % (#(+ % (* % %)) %)) 5) ; sorry for the eye bleed

L'output era:

IllegalStateException Nested #()s are not allowed  clojure.lang.LispReader$FnReader.invoke (LispReader.java:630)
...and a bunch of other garbage
    
posta Lincoln Bergeson 04.12.2012 - 23:49
fonte

3 risposte

5

Sapresti che% appartiene alla funzione interiore. Lo svantaggio è che si perderebbe l'accesso alla% nella funzione esterna.

Utilizza invece la sintassi fn [x] .

    
risposta data 05.12.2012 - 00:09
fonte
10

È completamente arbitrario; c'è un paio di righe nel parser che lo disabilitano esplicitamente. Se modifichi quella linea, puoi avere funzioni anonime nidificate e agiscono esattamente come ti aspetteresti.

in particolare, righe 634-635 in link

public static class FnReader extends AFn{
    public Object invoke(Object reader, Object lparen) {
        PushbackReader r = (PushbackReader) reader;
        if(ARG_ENV.deref() != null) // <-- line 634
            throw new IllegalStateException("Nested #()s are not allowed");
        // ...
    
risposta data 24.01.2013 - 22:56
fonte
3

Puoi avere funzioni anonime nidificate dell'ordinamento (fn [params] (corpo)). Solo la sintassi # non supporta l'annidamento.

    
risposta data 05.12.2012 - 00:07
fonte

Leggi altre domande sui tag