Ich werde eine leicht subjektive Frage stellen und eine höchst subjektive Antwort geben, da Ira schon eine vollkommen pragmatische und logische gegeben hat. :-)
Ich weiß, Dinge explizit zu schreiben wird in einigen Kreisen sehr geschätzt (die Python-Jungs machen es zu ihrem "Zen"), aber selbst als ich Python schrieb, habe ich es nie verstanden. Ich möchte jederzeit auf höchstem Niveau schreiben. Wenn ich Dinge explizit schreiben möchte, benutze ich die Assemblersprache. Der Zweck der Verwendung eines Computers (und eines HLL) ist es, diese Dinge für mich zu tun!
Für Ihre my-remove-if
Beispiel, die reduzieren Sie sieht gut aus mir (abgesehen von den Scheme-Ismen wie fold
und lst
:-)). Ich bin vertraut mit dem Konzept von reduzieren, so alles, was ich brauche, um es zu verstehen, ist herauszufinden, Ihre f(x,y) -> z
. Für die explizite Variante musste ich eine Sekunde darüber nachdenken: Ich muss die Schleife selbst herausfinden. Rekursion ist nicht das schwierigste Konzept, aber ich denke, es ist schwieriger als "eine Funktion von zwei Argumenten".
Ich interessiere mich auch nicht für eine ganze Zeile wird wiederholt - (my-remove-if pred (cdr lst))
. Ich denke, ich mag Lisp teilweise, weil ich absolut rücksichtslos bei DRY bin, und Lisp erlaubt mir, auf Achsen, die andere Sprachen nicht tun, DRY zu sein. (Sie könnten eine andere LET
an der Spitze, um dies zu vermeiden, aber dann ist es länger und komplexer, was ich denke, ist ein weiterer Grund, die Reduktion zu bevorzugen, obwohl ich an dieser Stelle könnte nur rationalisieren.)
Ich denke vielleicht die Kontexte, in denen die Python Jungs zumindest implizite Funktionalität nicht mögen würde:
- wenn niemand erwarten konnte, das Verhalten zu erraten (wie
frobnicate("hello, world", True)
- was bedeutet Wahre bedeuten?), Oder:
- Fälle, in denen es sinnvoll ist für die implizite Verhalten (wie zu ändern, wenn das
True
Argument bewegt wird, oder entfernt wird, oder durch etwas anderes ersetzt werden, da in den meisten dynamischen Sprachen keine Fehler bei der Kompilierung gibt es)
Aber reduce
in Lisp scheitert beide dieser Kriterien: Es ist eine gut verstandene Abstraktion, die jeder kennt, und das wird sich nicht ändern, zumindest nicht auf irgendeiner Zeitskala, die mir wichtig ist.
Jetzt glaube ich absolut sind einige Fälle, in denen es für mich einfacher wäre, einen expliziten Funktionsaufruf zu lesen, aber ich denke, dass Sie ziemlich kreativ sein müssen, um mit ihnen zu kommen. Ich kann mir keine Gedanken machen, denn reduce
und mapcar
und Freunde sind wirklich gut Abstraktionen.
Beachten Sie, dass die meisten CLs nicht Tail-Call-Optimierung tun, damit die gemeinsamen Idiome in CL unterschiedlich sind, und in der Regel gegen diese Art von Rekursion-basierte Schleifen vorgespannt. (Und BTW, einige Schemers wurden spezifischer Racketeers, einige nicht.) –
Welche der heutigen CL-Implementierungen, die ihren Namen wert sind, führen KEINE Tail-Call-Optimierung unter den richtigen Optimierungseinstellungen durch? – danlei
Im Jahr 2006 laut mindestens SBCL, ECL, CLISP, GCL, Lispworks und Franz unterstützte es in ihren Compilern. Vom einfachen Googeln aus sieht es aus, als würden Corman und Clozure es auch tun. Ich kann keine Informationen über Sciener finden, aber es scheint eine andere CMUCL-Gabel zu sein, also vermute ich, dass es wahrscheinlich ist. Ich kann keine Informationen für ABCL finden, aber es sieht so aus, als würde es wahrscheinlich nicht funktionieren. –
Ken