Извршува функција додека не врати нула, собирајќи ги нејзините вредности во список

Оваа идеја ја добив од стрипот Hofstadter на XKCD ; кој е најдобриот начин да се создаде условна јамка во (кој било) дијалект Lisp што извршува функција сè додека не се врати NIL во кое време ги собира вратените вредности во список.

За оние кои не ја видов шегата, се работи дека автобиографијата на Даглас Хофстадер со „осум зборови“ се состои од само шест зборови: „Јас сум толку мета, дури и овој акроним“ што содржи продолжение на шегата: (необичен мета-парапросдокијан?) „Дали е Мета“ - шегата е дека автобиографијата е всушност „Јас сум толку мета, дури и овој акроним е мета“. Но, зошто да не одиме подлабоко?

Претпостави ја акронимизирачката функција 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")

Кој е најдобриот начин да се направи тоа?

9
задан Jeremy Banks 8 July 2012 в 03:12
поделиться