+129
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
;;; Returns a string and 'T' if the list is in a desc. or asc. order, and NIL otherwise
(defun ordered (list)
(let ((list-dec (copy-list list)))
(let ((list-inc (copy-list list)))
(let ((alist (sort list-inc #'<)))
(let ((dlist (sort list-dec #'>)))
(cond
((equal list dlist)
(format nil "~%The numbers in ~a are in a descending order. ~%T" list))
((equal list alist)
(format nil "~%The numbers in ~a are in an ascending order. ~%T" list))))))))
Задача была следующей: функция должна возвращать t (истина), если в списке все элементы либо в восходящем, либо в нисходящем порядкe, и соответсвенно nil (ложь), если нет. Думаю, вполне сгодится сюда :)
http://www.lispforum.com/viewtopic.php?f=2&t=1275
Запостил:
wvxvw,
08 Июля 2011
Это что, опаскаленного учат языку программирования?
UPD Вру, ни один let не нужен. И cond не нужен. И говнокод этот тут не нужен, ибо уныл.
Уродство в имплементации: 4 уровня let'ов, cond без t-случая. Говно в том, что на неплохую задумку осуществили через задницу. Это не весело и красиво, это грустно и уродливо (и при этом не на PHP).
Ну а длинные списки - это да, тут не отвертеться.
Собственно вот, вариант конечно гораздо длиннее, но так же учитывает этот момент:
Нельзя ли просто рекурсивно вызвать `asc-or-desc' если car = cadr? И поцчему t в ядренях, а не под if.
зы... на хаскеле читабельнее (впрочем, полагаю, что и на схеме тоже).
2. Потому что маловероятно, что именно эта ветка будет выбиратся чаще.
3. CL не гарантирует оптимизации рекурсии, зачем рисковать? :)
2. Пожалуй, да. Зато симпотичней.
3. CL (и стандарты) знаю плохо, но об этом в курсе, впрочем есть и `sbcl'... И вообще, схема же для лаб адекватнее.
На чем писать я не выбирал, да и вообще, язык на котором это написано тут ни при чем, напишите то же самое на Си, тот же эффект будет.
ЗЫ. SBCL - Steel Bank Common Lisp - т.е. одна из реализаций CL (Common Lisp).
> (if ... '>= '<=)
> asc-or-desc
непоследовательно (не нужно asc или desc отдельно, нужно or), этот случай-таки имелся ввиду при написании? ;)
> SBCL - Steel Bank Common Lisp - т.е. одна из реализаций CL (Common Lisp)
спасибо, но `sbcl' и приводился как пример открытой реализации с "tail-call optimization"
2. Возвращаемый тип -- Bool
(конкретно в этом подходе; можно было бы возвращать 'eq | 'asc | 'desc, не знаю есть ли готовый тип)
'(1 1) - упорядочен и по неубыванию, и невозрастанию, имхо, пользующийся функцией ожидал бы t.
Все функциональные боги считают, что на лиспе лаб не бывает.