我從XKCD's Hofstadter comic得到了這個想法;在(任意)Lisp方言中創建條件循環的最佳方式是執行函數,直到它返回NIL
,此時它將收集的返回值收集到列表中。執行一個函數,直到它返回一個零,將其值收集到一個列表中
對於那些沒有見過這個笑話的人來說,道格拉斯霍夫斯塔特的「八字」自傳只包含六個字:「我是如此元,甚至是這個首字母縮寫」,包含了這個笑話的延續:奇怪的元paraprosdokian?)「是元」 - 這個笑話是,自傳實際上是「我是元,甚至這個首字母縮略詞是Meta」。但爲什麼不更深入?
假設acronymizing功能META
從一個字符串創建一個縮寫詞,它分裂成的話,返回NIL
如果字符串包含只有一個詞:
(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
現在我正在尋找如何實現功能所以:
(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")
這樣做的最好方法是什麼?
約旦的答案「欺騙」通過僅針對特定情況進行連線。對於一般用途
(meta)
,您將不得不決定單詞邊界在哪裏。你可以使用一個字典文件。 – compman@compman,他的問題具體說是假設'meta'的存在,所以我不會稱之爲「作弊」。不過,你有一點。我不太確定*如何判斷詞邊界的位置,即使給出了字典。一個特定的問題是如何決定你正在看一個單詞,並應該終止。 編輯:一種方式可能是說「如果這個詞在我的詞典中,或者如果我不能將這個詞分成任何數量的子詞,這樣他們都在我的詞典中,終止」。 –