Показать сообщение отдельно
Непрочитано 20.05.2010, 13:54 #1
Функция "рекурсивирования" или рекурсивная lambda
Дима_
 
Продуман
 
Питер
Регистрация: 22.02.2007
Сообщений: 2,843

Вот эта тема (а точнее оффтопное направление по поводу функций\операторов заданное уважаемым ShaggyDoc'ом) натолкнуло меня на мысль о возможности совместить две, одни из самых интересных, возможности LISP - рекурсия и lambda. Вот что из этого вышло:

Код:
[Выделить все]
(defun recurs (p f x);создает рекурсивный список до выполнения условия p функции f с начальным аргументом х
  (if (p x)
      (cons x nil)
      (cons x (recurs p f (f x)))))
При всей малости кода функции, по крайней мере лично для меня, она открывет "большие удобства" а именно - если внутри лямбды хочеться используеть рекурсии - то совсем не обязательно выводить их в новую функцию:
Пример1 - получить список от 0 до х (целое, положительное):
классика:
Код:
[Выделить все]
(defun test (x)
(if (zerop x) (cons x nil) (cons x (test (1- x)))))
(reverse (test 10))
аналог:
Код:
[Выделить все]
(reverse (recurs zerop 1- 10))
Пример2 (посложнее) - выровнять слово str пробелами с правой стороны до 10-ти символов:
классика:
Код:
[Выделить все]
(defun rovno (str)
(if (>=(strlen str) 10) str (rovno (strcat str " "))))
(rovno "test")
аналог:
Код:
[Выделить все]
(last (recurs (lambda (str) (>= (strlen str) 10)) (lambda (str) (strcat str " ")) "test"))
Количество кода в общем-то не уменьшается, но дает возможность использовать рекурсию внутри ламбды - не "засоряя" имена.
p.s. - немного подправил функцию - чтоб сохранял последний аргумент
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 20.05.2010 в 14:11.
Просмотров: 13521
 
Размещение рекламы