Führt eine Funktion aus, bis sie eine Null zurückgibt und ihre Werte in einer Liste sammelt

9

Ich habe diese Idee von XKCDs Hofstadter-Comic bekommen; Was ist der beste Weg, um eine bedingte Schleife in einem (beliebigen) Lisp-Dialekt zu erstellen, der eine Funktion ausführt, bis% ce_de% zurückgegeben wird und die zurückgegebenen Werte in einer Liste gesammelt werden.

Für diejenigen, die den Witz nicht gesehen haben, ist es so, dass Douglas Hofstadters Autobiographie "acht Worte" aus nur sechs Wörtern besteht: "Ich bin so Meta, sogar dieses Akronym", das die Fortsetzung des Witzes enthält: (etwas seltsam Meta-Paraprosdokian?) "Ist Meta" - der Witz ist, dass die Autobiographie tatsächlich ist "Ich bin so Meta, auch dieses Akronym ist Meta". Aber warum nicht tiefer gehen?

Nehmen wir die Abkürzungsfunktion NIL an, die ein Akronym aus einer Zeichenkette erzeugt und sie in Wörter aufteilt. Gibt META zurück, wenn die Zeichenkette nur ein Wort enthält:

%Vor%

Jetzt bin ich auf der Suche nach einer Funktion wie folgt zu implementieren:

%Vor%

Was ist der beste Weg, dies zu tun?

    
Iceland_jack 28.06.2011, 17:33
quelle

2 Antworten

3

Das ist einfach. Ich möchte keine Lösung schreiben, also werde ich es tun - aber es wird die beschissene elisp-Version sein, die zu unerwarteter Erleuchtung führen kann, wenn du das durchmachst:

%Vor%

Um das auszuprobieren, brauchst du meta , aber ich weiß nicht, wie du entscheiden würdest, wo du die Leerzeichen ablegen sollst. Stattdessen täusche ich es vor:

%Vor%

Dies macht den Code, den Sie arbeiten möchten. Wie für die Erleuchtung - versuchen Sie es so zu schreiben, anstatt was Sie wollen, so-function wird eine Funktion höherer Ordnung sein - eine, die so funktioniert:

%Vor%

oder in Schema:

%Vor%

Der große Hinweis hier ist, dass Sie es nicht einfach machen können (zumindest nicht ohne Tricks aus der cl -Bibliothek). Um die volle Punktzahl zu erhalten, vermeiden Sie die Mutationen - dies führt zu der natürlichen Art und Weise, wie Sie es in Scheme schreiben würden, und könnte sogar lesbarer aussehen als die setq -Version.

    
Eli Barzilay 28.06.2011, 17:50
quelle
1

Warf das zusammen und es scheint zu funktionieren:

%Vor%

Mit einer leicht modifizierten Version von meta Eli Barzilay gepostet,

%Vor%

Ich bekomme das Ergebnis, nach dem Sie gesucht haben.

%Vor%

Bearbeiten : @Rainer Joswig hat darauf hingewiesen, dass collect-until-null den Stapel ausschütten wird, wenn eine ausreichend große Sequenz angegeben wird. Unten ist Rainers iterative Version ohne dieses Problem.

%Vor%     
Jordan Wade 28.06.2011 18:21
quelle

Tags und Links