2009-04-02 15 views
5

ich gerade angefangen habe Common Lisp lernen - und fallen schnell in ihn verliebt - und ich habe gerade auf den Typ-System bewegt. Ich scheine eine besondere Vorliebe für anwendungsbezogene Programmierung zu entwickeln.Applicative Programmierung und Common Lisp Typen

Wie ich es verstehe, sind in CL-Strings und Listen beide Sequenzen, aber es scheint nicht alle Standardfunktionen für die Zuordnung über eine Sequenz zu sein, nur Listen. Ich kann sehen, warum sie für Listen bereitgestellt werden, was mit ihnen der grundlegende Datentyp und alles ist, aber warum war es nicht entworfen, um mit Sequenzen zu arbeiten? Da es sich um einen allgemeineren Typ handelt, scheint es sinnvoller zu sein, anwendungsbezogene Funktionen auf sie und nicht auf Listen auszurichten. Oder irre ich völlig falsch, wie es funktioniert?

Edit:

Was ich besonders verwirrt fühlte sich über die Art und Weise war, die Sequenzen - die Abstraktion - und Listen - eine Implementierung - scheint in CL konfus werden. Der Konsens scheint zu sein, dass dies aus historischen Gründen geschieht; Lisp gibt es schon so lange, dass man mit seinen Funktionen und Makros die Entwicklung von Softwareentwicklungspraktiken ziemlich genau abbilden kann; welche Funktionen für Sequenzen gelten und welche für Listen auf den ersten Blick willkürlich erscheinen, weil CL eine Mischung aus Vorsequenz-Abstraktionsfunktionen hat, die nur auf Listen operieren, und Funktionen, die das Gleiche allgemein auf Sequenzen tun. Als jemand, der gerade CL im Moment lernt, denke ich, dass es nützlich wäre, wenn Autoren zuerst Sequenzen als sauberere Abstraktion einführten und dann Listen als grundlegendste Implementierung dieser Abstraktion kauften. Listen würden immer noch als Syntax benötigt werden, aber zu dem Zeitpunkt, wo es notwendig ist, dies ausdrücklich zu erklären, hätten viele Leser das selbst herausgefunden, was für den Anfang ein ziemlicher Ego-Boost wäre.

Antwort

1

Nun, sind Sie in der Regel korrekt. Die meisten Funktionen in der Tat Sie auf Listen konzentrieren (mapcar, find, count, remove, append etc.) Für ein paar von diesen gibt es äquivalente Funktionen für Sequenzen (concatenate, some und every in den Sinn kommen), und einige, wo die Liste-Äquivalent ist veraltet (z. B. nth für Listen nur vs. elt für alle Sequenzen). Einige Funktionen arbeiten einfach mit Sequenzen (zB length).

CL ist ein bisschen ein Durcheinander. Es ist eine große Sprache, wie in riesigen. Über 700 Funktionen, AFAIK. Und es ist alt. Einige dieser Funktionen werden konventionsbedingt nicht mehr verwendet, andere nur selten, wenn überhaupt.

Ja, wäre es sinnvoller sein, Mapping-Funktionen Methoden zu haben, die auf allen Sequenzen wie vorgesehen angewandt. CL wurde einfach nicht so gebaut. Wenn es heute wieder gebaut würde, würde ich sicher sein, dass dies berücksichtigt würde, und es würde sehr anders aussehen.

Das heißt, Sie sind nicht vollständig in der Kälte. Das loop Makro funktioniert auf Sequenzen, wie auch iterate (ein separates Looping-Makro, das ich zufällig mehr mag). Das wird dich weit bringen. Für die meisten praktischen Zwecke werden Sie Listen verwenden, und dies wird nicht mehr als ein pragmatisches Problem sein. Wenn Sie eine Mapping-Funktion für Vektoren (oder Sequenzen im Allgemeinen) nicht haben, wer soll Sie davon abhalten, es zu schreiben?

+5

COUNT, FIND, REMOVE funktioniert gut über Sequenzen. Überprüfen Sie das Sequenzwörterbuch des ANSI CL-Standards. –

+0

Nun gut, nun, was weißt du? Ich sprach dort ein bisschen vor mir. Vielen Dank! –

+0

Sie haben vielleicht vor sich gesprochen, aber Sie haben mir die Antwort gegeben, die ich brauchte. Was mich verwirrte, war, warum die Abstraktion zwischen Sequenzen als allgemeinem Fall und Listen als die Implementierung so in CL verworren schien; Jetzt weiß ich, dass es aus historischen Gründen ist. Vielen Dank! –