LINUX.ORG.RU

CommonLisp: вернуть список из функции


0

0

Здравствуйте,
 совсем простенький вопрос новичка. Вот такой код

  (defun %pair% (a b)
        (loop for op in (list #'- #'+) do (funcall op a b)))

Как мне нужно этот код переписать, что бы при (%pair% 2 2) возвращался
список (0 2)? Т.е. что бы значения накапливались. 

Знания по лиспу пока ограничиваются парой первых глав PCL -- хочется
пока поиграться с такими основами, что бы читать дальше.

И как этот код записать в более true-lisp-way? Спасибо.
anonymous

(mapcar #'(lambda (fn) (funcall fn 2 2)) (list #'- #'+))

btw: s/(0 2)/(0 4)/

asgard
()

asgard:
> btw: s/(0 2)/(0 4)/
 Очепятка :)

> (mapcar #'(lambda (fn) (funcall fn 2 2)) (list #'- #'+)) 
 Спасибо. Заодно теперь мне стало известно и про mapcar :)


Miguel:
> Заменить do на collect. 
 Использование loop я тупо скопипастил с сампла, ибо:
 1) пока с макросами даже еще не разбирался
 2) до соответствующей главы о работе с циклами еще не дочитал ;)

> А чем тебе не true-lisp-way?
 Ну это был робкий вопрос: мало ли что-нибудь в коде не так :),
 ибо стиль ЛИСПа пока для меня абсолютно в новинку.

anonymous
()

Не понимаю, зачем мудрить и чем самое тривиальное решение не устраивает:

(defun pair (a b)
  (list (- a b) (+ a b)))

stassats ★★★★
()
Ответ на: комментарий от UrbanSerj

stassats:
> Не понимаю, зачем мудрить и чем самое тривиальное решение не устраивает:
 Нужен re-use кода. Вот для такой ситуации (исключительно, еще один сампл):

  (defun %compute-root-pair% (&key det a b)
    " Accessorial function. Actual for det > 0 only "
    (mapcar #'(lambda (fn)
                (/ (funcall fn (* b -1) (sqrt det))
                   (* 2 a)))
            (list #'- #'+)))


> man "индусский код"
 Еще один разбирающийся в методах re-use? В /dev/null

anonymous
()
Ответ на: комментарий от Miguel

>А чем тебе не true-lisp-way?
At least one of Common Lisp's original designers hated it. LOOP's detractors complain that its syntax is totally un-Lispy (in other words, not enough parentheses) (c) PCL :)

ratatosk
()
Ответ на: комментарий от ratatosk

В упор не понимаю подобных утверждений.

Основная фишка Lisp-а - практически неограниченная возможность создания DSEL. В данном случае мы как раз этот самый DSEL и имеем, хорошо спроектированный и более чем юзабельный.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Просто некоторые больше любят функциональную сторону лиспа, и во всю ею пользуются :) а всякого рода лупы - не есть функшионал-вей %))

Cy6erBr4in ★★★
()
Ответ на: комментарий от Miguel

С чего это вдруг? Если можно на лиспе писать в функциональном стиле, нафига брать другой язык?

Cy6erBr4in ★★★
()
Ответ на: комментарий от Miguel

> Тогда надо Хаскель юзать.

просто нужно уметь *грамотно* миксовать различные парадигмы, и применять тот илиной подод там и только там, где он покажет себя лучше остальных. не правы как чёкнутые адепты pure fp, так и не менее чёкнутые адепты oop, пихиющие свои любимые парадигмы влюбую "дырку".

asgard
()
Ответ на: комментарий от anonymous

Это не реюз кода, а черт-те что. Не надо пытаться упростить то, что и так просто. Код не становится ни понятней, ни быстрее.

Потом, что делают «%» вокруг имени функции? На кой черт параметры передаются через &key? За такой код нужно бить линейкой по пальцам.

stassats ★★★★
()
Ответ на: комментарий от stassats

ну реюз кода тут таки имеет место быть, но только в следующем случае:

(defconst a ...)
(defconst b ...)

(setq flist (list #'+ #'- #'* #'/ #'(lambda (x y) ...) ...))
(setq result (mapcar #'(lambda (x) (funcall x a b)) flist))

asgard
()
Ответ на: комментарий от asgard

Реюз-то он реюз, но только он там нафиг не сдался.

stassats ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.