| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Умножить все элементы списка на число (без лямбды)

LISP. Умножить все элементы списка на число (без лямбды)

Ответ
Поиск в этой теме
Непрочитано 26.01.2014, 15:12 #1
LISP. Умножить все элементы списка на число (без лямбды)
WhiteShark
 
Регистрация: 30.03.2012
Сообщений: 101

По-моему видел где-то такое, но сам сообразить что-то не могу.
Нужно умножить на число все элементы списка не используя лямбду (то есть (mapcar '(labmda (x) (* x number)) lst) не катит) рекурсию, foreach и т.п. только через mapcar и apply.
Просмотров: 4289
 
Непрочитано 26.01.2014, 17:37
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


сам-то понял чего написал?
gomer вне форума  
 
Автор темы   Непрочитано 26.01.2014, 17:44
#3
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Ну что непонятного? Надо сделать из (1 2 3) к примеру (2 4 6) используя только mapcar и apply. Ну и конечно кратко и красиво
WhiteShark вне форума  
 
Непрочитано 26.01.2014, 18:41
#4
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Так попробуй
Код:
[Выделить все]
 (defun mult (lst1 lst2  / )
   (defun foo (num mul)(* num mul))
   (if (or (vl-some 'not (mapcar 'numberp lst1))(vl-some 'not (mapcar 'numberp lst2)))   
     (alert "Recognised non numeric item in a list!")
     (mapcar 'foo lst1 lst2)
   )
)
;;Вызов:
(mult  (list 1 2 3 4) (list 5 6 7 8));<--'(5 12 21 32)
(mult  (list 1 2 3 nil) (list 5 6 7 8));<-- "Recognised non numeric item in a list!"
Олег (jr.) вне форума  
 
Непрочитано 26.01.2014, 19:00
#5
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от WhiteShark Посмотреть сообщение
Ну что непонятного?
через mapcar нельзя, нужно через mapcar. Вот что не понятно. Если по простому...
Код:
[Выделить все]
 (defun double (x) (+ x x))
(mapcar 'double '(0 1 2 3 5))
gomer вне форума  
 
Автор темы   Непрочитано 26.01.2014, 19:11
#6
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Спасибо, видимо, нельзя так сделать без определения внешней функции, как в ваших примерах double или foo. Defun я не включил не перечислил но это та же lambda по сути. И надо в общем случае не удвоить, а на любое число умножить.
WhiteShark вне форума  
 
Непрочитано 26.01.2014, 21:12
#7
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 188
Отправить сообщение для nolte с помощью Skype™


(mapcar '* (subst (getint) 1 (mapcar '/ f f)) f)
единственная проблема 0 в списке.
__________________
Знание лисп: со справочником Н. Полещука

Последний раз редактировалось nolte, 26.01.2014 в 21:19.
nolte вне форума  
 
Непрочитано 26.01.2014, 21:22
#8
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


Код:
[Выделить все]
 ;;; умножение на сто =)
(mapcar '* '(1 2 3) '(100 100 100))
AY вне форума  
 
Непрочитано 26.01.2014, 21:26
#9
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от nolte Посмотреть сообщение
единственная проблема
в том что это работает в 2 раза медленнее чем с лямбдой, так как 2 цикла вместо одного
gomer вне форума  
 
Непрочитано 26.01.2014, 21:58
#10
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 188
Отправить сообщение для nolte с помощью Skype™


gomer, про скорость ничего не говорилось а условии, а если она нужна то почему бы и лямбду не попользовать.
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Непрочитано 26.01.2014, 22:04
#11
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от nolte Посмотреть сообщение
если она нужна то почему бы и лямбду не попользовать
gomer вне форума  
 
Непрочитано 26.01.2014, 23:09
#12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Автокада под рукой нет - но как-то так
Код:
[Выделить все]
 (defun test (x lst) (if lst (cons (* x (car lst)) (test x (cdr lst)))))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 27.01.2014, 11:29
#13
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Написал сам, правда, не так изящно, как вроде где-то встречал (да и subst не хотел использовать)

(mapcar '* (subst n 0 (mapcar '- lst lst) lst)
WhiteShark вне форума  
 
Непрочитано 27.01.2014, 16:37
#14
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 188
Отправить сообщение для nolte с помощью Skype™


Цитата:
(mapcar '* (subst n 0 (mapcar '- lst lst) lst)
для этого не сработает (-2 5 -4 9)
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Автор темы   Непрочитано 27.01.2014, 17:31
#15
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Код:
[Выделить все]
 (defun test (n lst /)
  (mapcar '* (subst n 0 (mapcar '- lst lst)) lst)
)
Всё работает. Просто скобочку одну забыл
WhiteShark вне форума  
 
Непрочитано 27.01.2014, 19:39
#16
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 188
Отправить сообщение для nolte с помощью Skype™


да да это я попутал все хорошо. молодца.
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Непрочитано 27.01.2014, 19:42
#17
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


польза от таких танцев с бубном сомнительна, разве что для учебных целей. Решение с лямбдой - даже меньше букаф получается
gomer вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Умножить все элементы списка на число (без лямбды)

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нарисовать полилинию из списка с координатами точек (lisp) paradoxvaha LISP 50 10.04.2023 15:09
Сортировка списка (элементы текст) по возрастанию sdv79 Программирование 20 02.01.2012 23:45
Как можно из LISP запросить у юзера выделить произвольные элементы и затем вызвать аналог WMFOUT для сохранения их в изображении? lexluther LISP 4 12.08.2009 11:44
Lisp: Обработка объектов и получение списка свойств (координаты точек) Nanotronic LISP 2 23.04.2009 23:07
каков максимальный объем списка в Lisp Victorovich LISP 4 01.07.2008 17:43