Mam ten pomysł od XKCD's Hofstadter comic; jaki jest najlepszy sposób utworzenia pętli warunkowej w (dowolnym) dialekcie Lisp, który wykonuje funkcję, dopóki nie zwróci NIL
, kiedy zbierze zwrócone wartości do listy.Wykonuje funkcję, aż zwróci zero, zbierając swoje wartości do listy.
Dla tych, którzy nie widzieli tego dowcipu, to prawda, że "ośmiokrotna" autobiografia Douglasa Hofstadtera składa się tylko z sześciu słów: "Jestem tak meta, nawet ten akronim", co stanowi kontynuację żartu: (niektóre dziwny meta-paraprosdokian?) "Is Meta" - żart jest taki, że autobiografia jest w rzeczywistości "Jestem taki meta, nawet ten akronim jest meta". Ale dlaczego nie pójść głębiej?
przejąć funkcję acronymizing META
który tworzy skrót z ciągiem i dzieli go na słowach zwraca NIL
jeśli ciąg zawiera tylko jednym słowem:
(meta "I'm So Meta, Even This Acronym") ⇒ "Is Meta"
(meta (meta "I'm So Meta, Even This Acronym")) ⇒ "Im"
(meta (meta (meta "I'm So Meta, Even This Acronym"))) ⇒ NIL
(meta "GNU is Not UNIX") ⇒ "GNU"
(meta (meta "GNU is Not UNIX")) ⇒ NIL
Teraz szukam sposobu realizacji funkcji tak:
(so-function #'meta "I'm So Meta, Even This Acronym")
⇒ ("I'm So Meta, Even This Acronym" "Is Meta" "Im")
(so-function #'meta "GNU is Not Unix")
⇒ ("GNU is Not Unix" "GNU")
Jaki jest najlepszy sposób na zrobienie tego?
Odpowiedź Jordana "oszukuje" przez podłączenie tylko do określonych przypadków. W ogólnym celu
(meta)
, musisz zdecydować, gdzie są granice słów. Możesz użyć pliku słownika. – compman@compman, jego pytanie mówi się konkretnie o założeniu istnienia 'meta', więc nie nazwałbym tego" oszustwem ". Nadal masz rację. Nie jestem do końca pewien * jak * zdecydować, gdzie są granice słów, nawet biorąc pod uwagę słownik. Jednym szczególnym problemem byłby sposób, w jaki zdecydowałbyś się na jedno słowo i powinien on zostać rozwiązany. EDYCJA: Jednym ze sposobów może być powiedzenie "jeśli to słowo znajduje się w moim słowniku lub jeśli nie mogę podzielić tego słowa na dowolną liczbę pod-słów, tak, że wszystkie znajdują się w słowniku, zakończ". –