【发布时间】:2011-09-24 12:54:41
【问题描述】:
我从XKCD's Hofstadter comic 得到这个想法;在(任何)Lisp 方言中创建一个条件循环的最佳方法是什么
对于那些没有看过这个笑话的人来说,道格拉斯·霍夫施塔特的“八个字”自传只有六个字:“I'm So Meta, Even This Acronym”,其中包含笑话的延续:(有些奇怪meta-paraprosdokian?)“Is Meta”——开玩笑的是自传实际上是“我是如此 Meta,即使这个首字母缩写词也是 Meta”。但是为什么不更深入呢?
假设首字母缩略词函数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,他的问题专门说假设存在
meta,所以我不会称之为“作弊”。不过,你说得有道理。我不太确定 how 来决定单词边界的位置,即使给定了一本字典。一个特殊的问题是如何确定您正在查看一个单词并应该终止。编辑:一种方法可能是说“如果这个词在我的字典里,或者如果我不能把这个词分成任意数量的子词,这样它们都在我的字典里,终止”。
标签: lisp elisp common-lisp