Sind verwenden, die eine spezielle Syntax wirklich helfen würde? Betrachten Sie die folgende
(lambda (x)
(and (is-fruit-p x)
(or (grows-on-tree-p x)
(is-red-p x))))
und jetzt die etwas allgemeinere
(lambda (x)
(and (is-fruit-p x)
(or (grows-on-tree-p x)
(eq (color x) 'red))))
oder
(lambda (x)
(and (is-fruit-p x)
(or (grows-on-tree-p x)
(eq (color x) desired-color)))) ; desired-color captured lexical
Auch wenn Sie eine spezielle Syntax aufbauen für Prädikate denken Sie, die weitere Sprachen Komplexität ist es wert die Starrheit, die du bekommen wirst? Zum Beispiel werden Sie ein Prädikat #'weights-exactly-five-ounces-p
definieren? Was ist mit #'weights-up-to-and-including-six-and-half-ounces-p
?
Wenn Sie ein parametrisches Prädikat benötigen und dafür Lambda-Formulare verwenden, dann schreiben Sie mit einem Combiner mehr Code als Sie nicht verwenden, da der Wrapper (lambda (x) ...)
für jeden parametrischen Term benötigt wird. Noch wichtiger ist, dass dieser Code auch schwieriger ist lesen (zusätzlich zu einem speziellen neuen Makro für Prädikat Kombination zu lernen).
IMO Es kann sinnvoll sein, zu schreiben und/oder Kombinatoren, wenn Sie in Prädikaten übergeben werden und Sie müssen Prädikate an jemand anderen übergeben ... aber nicht für den Code, den Sie in dem Beispiel verwendet haben; dafür würde ich schreiben
Weniger zu schreiben, weniger zu lesen, nichts zu lernen, trivial zu parametrisieren.
Angenommen, Sie möchten zum Beispiel eine Liste von Früchten mit der gleichen Farbe wie die, die Sie haben (in mine
) und mit gleichem Gewicht oder möglicherweise schwerer ...
(remove-if-not (lambda (x) (and (is-fruit-p x)
(eq (color x) (color mine))
(>= (weight x) (weight mine))))
objects)
'(defun Kompliment (Person & optional (Strom t)) (Format Stream "Hallo, ~ a, die Sie wirklich herrlicher Blick heute!" Person))' – Svante