2017-03-21 13 views
2

Ich möchte einige Integer-Arithmetik durchführen und überprüft, ob SBCL könnte mehr Geschwindigkeit gewinnen, wenn ich explizite Informationen über die type von Werten, die ich verwende. Während ich declare in einem defun oder let direkt direkt tun konnte, um dies zu tun, verstehe ich nicht, wo man die Aussage innerhalb eines loop Konstrukts setzt.Wie man den Typ einer Schleifenvariable deklariert

Ich bin auf die Dokumentation des iterate Pakets gestoßen, das solche Möglichkeiten bietet, aber für den Moment im Loop bleiben wollte.

Ein Stub Beispiel könnte wie folgt aussehen:

(loop :for i from 1 upto 100 :collect 
    (loop :for j from i upto 100 
    :collect (* i j))) 

Wie kann ich sagen, dass Lisp i und j sind z.B. vom Typ fixnum?

Antwort

4

Für einfache Typen wie fixnum, float, t und nil Sie können einfach die Art nach der Variablen in der FOR-Klausel schreiben. Sie können auch eine Art in einer numerischen Akkumulation Klausel wie eine sum Klausel hinzufügen:

(loop for i fixnum below 10 
     for j fixnum from 1 
     sum (* i j) fixnum) 
+0

Weglassen 'of-Code prägnant macht Baumuster zur, aber IMO, * weniger * lesbar. – sds

+0

@sds: Ich benutze das die ganze Zeit. Da nur FIXNUM und FLOAT für die kurze Notation sinnvoll sind, sehe ich kein Lesbarkeitsproblem. Die OF-TYPE-Notation ist im Code, den ich gesehen habe, relativ selten. –

+0

Ich verbeuge mich vor Ihnen Erfahrung :-) – sds

4

Verwendung of-type:

(loop :for i of-type fixnum from 1 upto 100 :collect 
    (loop :for j of-type fixnum from i upto 100 
    :collect (* i j))) 

Auch Examples of WITH clause nett sind.

Wie Rainer sagte, können Sie of-type für einfache Typen auslassen, z.B. fixnum und float, aber das verletzt die „Rhythmus“ von loop wobei loop Schlüsselwörter wechseln sich mit Benutzerformulare.

Beachten Sie, dass auch i und j erklärt fixnum s zu sein, ist nicht genug fixnum Multiplikation (das Quadrat von most-positive-fixnum ist sicherlich nicht ein fixnum) zu gewährleisten. Damit die schnellstmögliche Multiplikation, die Sie benötigen würde i und j zu erklären sein (unsigned-byte 1000) die tut erfordern of-type.

Natürlich sollte das alles nicht notwendig sein. Der Compiler sollte intelligent genug sein. :-)

Verwandte Themen