Tôi nhận ý tưởng này từ XKCD's Hofstadter comic; cách tốt nhất để tạo vòng lặp có điều kiện trong (bất kỳ) phương ngữ Lisp nào thực thi hàm cho đến khi nó trả về NIL
tại thời điểm nó thu thập các giá trị trả về vào một danh sách.Thực hiện một hàm cho đến khi nó trả về một con số không, thu thập các giá trị của nó vào một danh sách
Đối với những người chưa xem trò đùa, tự truyện của Douglas Hofstadter "tám từ" chỉ gồm sáu từ: "Tôi So Meta, Ngay cả từ viết tắt này" có chứa phần tiếp theo của trò đùa: (một số meta meta-paraprosdokian?) "Is Meta" - trò đùa là tự truyện thực sự là "Tôi So Meta, Ngay cả Từ viết tắt này là Meta". Nhưng tại sao không đi sâu hơn?
Giả chức năng acronymizing META
tạo ra một từ viết tắt từ một chuỗi và tách nó thành các từ, trả NIL
nếu chuỗi chứa nhưng một từ:
(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
Bây giờ tôi đang tìm cách để thực hiện một chức năng để:
(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")
Cách tốt nhất để làm điều này là gì?
Câu trả lời của Jordan "lừa đảo" bằng cách chỉ được kết nối với những trường hợp cụ thể. Với mục đích chung là
(meta)
, bạn sẽ phải quyết định ranh giới từ. Bạn có thể sử dụng một tập tin từ điển. – compman@compman, câu hỏi của ông cụ thể nói rằng giả sử sự tồn tại của 'meta' vì vậy tôi sẽ không gọi nó là" gian lận ". Tuy nhiên, bạn có một điểm. Tôi không hoàn toàn chắc chắn * làm thế nào * để quyết định nơi ranh giới từ là mặc dù, thậm chí được đưa ra một từ điển. Một vấn đề cụ thể sẽ là cách quyết định bạn đang xem một từ và nên chấm dứt. EDIT: Một cách có thể là để nói "nếu từ này có trong từ điển của tôi hoặc nếu tôi không thể chia từ này thành bất kỳ số lượng subwords nào sao cho tất cả trong từ điển của tôi, chấm dứt". –