Gibt es eine Möglichkeit, etwas wie lexikalische Verschlüsse mit Makrolet zu tun? Was ich tun möchte, ist das folgende Makro einen lokalen rekursiven Helfer zu machen, die eine Funktion auf jede Kombination ruft statt dessen eine Liste zu erzeugen, wie es jetzt das Makro in den ers ergibt sich Aufruf:Lexikalische Verschlüsse über Makrolet?
CL-USER> (combinations nil '(1 2 3) '(4 5 6))
((1 4) (1 5) (1 6) (2 4) (2 5) (2 6) (3 4) (3 5) (3 6))
Was würde Ich mag ist ein Makro, das eine Funktion und eine beliebige Anzahl von Listen und Ergebnissen in verschachtelten Schleifen verwendet, die die Funktion für jede Kombination aufrufen. Ich bin ziemlich neu zu Lispeln, das ist das erste Makro, das ich über 'nif' Klone und dergleichen geschrieben habe, so dass alle Vorschläge geschätzt werden.
Ich habe versucht, das Makro zu einem Makrolet in einem Makro, das eine Funktion und die Zeile '(nreverse (Liste, Artikel, @ Vars)) wird durch' ersetzt (func (nreverse (Liste, Artikel , @ vars))), aber ich bekomme Fehler, die besagen, dass func eine undefinierte Variable oder Funktion ist.
Dies ist die ursprüngliche Funktion:
(defmacro combinations (vars &rest lsts)
(with-gensyms (item)
`(loop for ,item in ,(car lsts) ,(if (null (cdr lsts)) 'collecting 'nconcing)
,(if (null (cdr lsts))
`(nreverse (list ,item ,@vars))
`(combinations (,item ,@vars) ,@(cdr lsts))))))
Dies ist, was ich mit macrolet versucht haben und nicht definierte Funktion ‚func‘ Fehler zu erhalten.
(defmacro for-all-combonations (func &rest lst)
(macrolet ((for-all (vars &rest lsts)
(with-gensyms (item)
`(loop for ,item in ,(car lsts) ,(if (null (cdr lsts))
'collecting 'nconcing)
,(if (null (cdr lsts))
`(func (nreverse (list ,item ,@vars)))
`(for-all (,item ,@vars) ,@(cdr lsts)))))))
(for-all nil lst)))
können Sie erklären, warum Sie Makros dafür verwenden möchten? Was soll ((a '((1 2 3) (4 5 6))) (Kombinationen nil a)) tun? –
Es sollte '((1 2 3)) ((4 5 6))) zurückgeben, was eine Liste aller Kombinationen ist, die ein Element aus jeder Liste von Eingaben pro Kombination nimmt. Ich mache das mit einem Makro, denn das habe ich gerade erforscht. Ich könnte es ohne Makros machen, aber ich wollte versuchen, ein Makro zu schreiben, das komplexer ist als nif. Dies gibt mir eine Chance herauszufinden, was kann und was nicht getan werden kann, ich hätte mich nie gefragt, ob ein Macrolet auf diese Weise anders verwendet werden kann. Hoffentlich verstehe ich Makros so viel besser. – asm
Ich denke nicht, dass dies mit einem Makro sinnvoll ist. Makros sind dazu da, Quellcode und nicht Daten zu berechnen. Wenn Sie Daten berechnen möchten, müssen die Daten zur Makroexpansionszeit vorhanden sein - was normalerweise nicht der Fall ist. –