+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
Lure Of Chaos 08.07.2011 14:04 # +2
guest 08.07.2011 14:45 # 0
wvxvw 08.07.2011 17:17 # 0
Lure Of Chaos 08.07.2011 17:24 # 0
Esper 08.07.2011 14:42 # +4
Это что, опаскаленного учат языку программирования?
UPD Вру, ни один let не нужен. И cond не нужен. И говнокод этот тут не нужен, ибо уныл.
wvxvw 08.07.2011 17:25 # +1
Esper 08.07.2011 19:43 # +1
Уродство в имплементации: 4 уровня let'ов, cond без t-случая. Говно в том, что на неплохую задумку осуществили через задницу. Это не весело и красиво, это грустно и уродливо (и при этом не на PHP).
Esper 08.07.2011 15:58 # +1
wvxvw 08.07.2011 17:15 # 0
Esper 08.07.2011 19:27 # 0
Ну а длинные списки - это да, тут не отвертеться.
wvxvw 08.07.2011 17:28 # 0
Esper 08.07.2011 19:17 # 0
wvxvw 08.07.2011 20:27 # 0
Собственно вот, вариант конечно гораздо длиннее, но так же учитывает этот момент:
greno 10.07.2011 15:57 # 0
Нельзя ли просто рекурсивно вызвать `asc-or-desc' если car = cadr? И поцчему t в ядренях, а не под if.
зы... на хаскеле читабельнее (впрочем, полагаю, что и на схеме тоже).
wvxvw 10.07.2011 16:24 # 0
2. Потому что маловероятно, что именно эта ветка будет выбиратся чаще.
3. CL не гарантирует оптимизации рекурсии, зачем рисковать? :)
greno 10.07.2011 16:38 # 0
2. Пожалуй, да. Зато симпотичней.
3. CL (и стандарты) знаю плохо, но об этом в курсе, впрочем есть и `sbcl'... И вообще, схема же для лаб адекватнее.
wvxvw 10.07.2011 17:03 # 0
На чем писать я не выбирал, да и вообще, язык на котором это написано тут ни при чем, напишите то же самое на Си, тот же эффект будет.
ЗЫ. SBCL - Steel Bank Common Lisp - т.е. одна из реализаций CL (Common Lisp).
greno 10.07.2011 18:38 # 0
> (if ... '>= '<=)
> asc-or-desc
непоследовательно (не нужно asc или desc отдельно, нужно or), этот случай-таки имелся ввиду при написании? ;)
> SBCL - Steel Bank Common Lisp - т.е. одна из реализаций CL (Common Lisp)
спасибо, но `sbcl' и приводился как пример открытой реализации с "tail-call optimization"
wvxvw 10.07.2011 19:45 # −1
greno 10.07.2011 19:51 # 0
wvxvw 10.07.2011 20:20 # 0
greno 10.07.2011 22:51 # 0
2. Возвращаемый тип -- Bool
(конкретно в этом подходе; можно было бы возвращать 'eq | 'asc | 'desc, не знаю есть ли готовый тип)
'(1 1) - упорядочен и по неубыванию, и невозрастанию, имхо, пользующийся функцией ожидал бы t.
greno 10.07.2011 22:59 # 0
wvxvw 11.07.2011 11:29 # 0
wvxvw 08.07.2011 20:32 # 0
istem 09.07.2011 02:37 # −1
guest 09.07.2011 13:01 # +1
Все функциональные боги считают, что на лиспе лаб не бывает.
wvxvw 10.07.2011 13:14 # +1