Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176
Common Lisp

Mapcar в lisp

12.05.2021, 17:08. Показов 4856. Ответов 12

Студворк — интернет-сервис помощи студентам
Как написать программу, которая применяет функции к элементам списка с помощью mapcar?

по такому шаблону

Lisp
1
2
3
4
(mapcar f1 f2 list1 list2)
 
; f1 - функция, применяемая к нечётным элементам
; f2 - функция, применяемая к чётным элементам
f1 и f2, я думаю просто сложением и вычитанием сделать например
Lisp
1
2
(defun f1 (a b) (+ a b))
(defun f2 (a b) (- a b))
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.05.2021, 17:08
Ответы с готовыми решениями:

Mapcar
помогите пожалуйста, было задание вывести только положительные ключи ассоциативного списка, но моя программа на месте отрицательного выдает...

apply и mapcar
Объясните пожалуйста тупому человеку (т.е. мне) различие между mapcar и apply?????

Функция mapcar
Почему при вычислении данного выражения выводится ответ (10 10 10), а не (30 20 10)? Играет ли тут какую-то роль функция маpcar? ...

12
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
12.05.2021, 18:16
Как это, к чётным элементам? К чётным элементам списка? Но у вас два списка - непонятно, кто должен быть чётным. Дайте лучше пример аргументов и значения.

Цитата Сообщение от ive_karp Посмотреть сообщение
(defun f1 (a b) (+ a b))
Переобозначить сложение через f1 - мощно.
0
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176
12.05.2021, 18:46  [ТС]
helter,
Цитата Сообщение от helter Посмотреть сообщение
К чётным элементам списка?
я так понял, да, к чётным и нечётным элементам списка (-ов)
честно, сам не понял, как подать на вход сразу два списка и применить к их элементам функции.
мне просто сказали, "напиши, чтоб было вот так"

Цитата Сообщение от ive_karp Посмотреть сообщение
Lisp
1
2
3
(mapcar f1 f2 list1 list2)
; f1 - функция, применяемая к нечётным элементам
; f2 - функция, применяемая к чётным элементам
* а, кстати, там в бумажке у меня написано "... - функция, применяемая к (не)чётным элементам listов"

Цитата Сообщение от helter Посмотреть сообщение
Дайте лучше пример аргументов и значения
(mapcar '(f1 f2) '(1 2 3 4) '(5 6 7 8) )

Цитата Сообщение от helter Посмотреть сообщение
Переобозначить сложение через f1 - мощно
всё равно это дальше аудитории в универе никуда не уйдёт
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
12.05.2021, 19:05
Цитата Сообщение от ive_karp Посмотреть сообщение
функция, применяемая к (не)чётным элементам listов"
Если один из них чётный, а второй нечётный, что делать? (1 2 3) и (4 5 6) - какая функция должна применяться к 1, 4?

Цитата Сообщение от ive_karp Посмотреть сообщение
(mapcar '(f1 f2) '(1 2 3 4) '(5 6 7 8) )
Во-первых, тут нет значения, которое, по вашему мнению, функция должна возвращать. Во-вторых, конкретно так работать не будет потому что работать не будет никогда. mapcar - стандартная функция, её первым аргументом должна быть функция (или function designator, если вы знаете, что это такое), а вы суёте ей список. Переопределять стандартные функции нельзя.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38189 / 21124 / 4307
Регистрация: 12.02.2012
Сообщений: 34,731
Записей в блоге: 14
12.05.2021, 20:38
Да, довольно дурацкая странная постановка задачи. Если на вход mapcar дается два списка, то функция, которая будет их обрабатывать, должна принимать два аргумента. Можно попробовать сделать так: пусть пары с четными индексами обрабатывает f1, а пары с нечетными - f2...

Как вариант (HomeLisp):

Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun super-mapcar (f1 f2 list1 list2)
  (mapcar (lambda (n x1 x2)
            (if (zerop (% n 2)) (funcall f1 x1 x2) (funcall f2 x1 x2)))
            (range 0 (min (length list1) (length list2))) list1 list2))
          
(super-mapcar (lambda (x y) (+ (/ 1 x) (/ 1 y))) ;; для четных - сложение обратных
              (lambda (x y) (* x y)) ;; для нечетных - произведение
              '(1 2 3 4 5 6)
              '(11 22 33 44 55 66))
 
==> (12/11 44 4/11 176 12/55 396)
2
 Аватар для _sg
4710 / 4405 / 380
Регистрация: 12.05.2012
Сообщений: 3,102
12.05.2021, 21:32
Lisp
1
2
3
4
5
6
7
8
(defun blink (f1 f2 w v)
  (cond ((null w) nil)
        ((null v) nil)
        ((cons (funcall f1 (car w) (car v))
               (blink f2 f1 (cdr w) (cdr v))))))
 
> (blink #'+ #'* '(4 5 4 5 4 5 4 5) '(4 5 4 5 4 5 4 5))
(8 25 8 25 8 25 8 25)
Добавлено через 1 минуту
Lisp
1
2
3
4
5
6
7
(defun blink (f1 f2 w v)
  (when (and w v)
    (cons (funcall f1 (car w) (car v))
          (blink f2 f1 (cdr w) (cdr v)))))
 
> (blink #'+ #'- '(4 5 4 5 4 5 4 5) '(4 5 4 5 4 5 4 5))
(8 0 8 0 8 0 8 0)
2
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176
12.05.2021, 22:16  [ТС]
Цитата Сообщение от helter Посмотреть сообщение
её первым аргументом должна быть функция
вот я думаю, может там подвох в задании

а можно тогда сделать так:
(пока формулировал, подумал, что можно пока обойтись без "мощных" функций f1 и f2)
Lisp
1
2
(mapcar #'+ '(10 10 10 10) '(1 2 3 4) ) => (11 10 13 10) ; для нечётных
(mapcar #'- '(10 10 10 10)  '(1 2 3 4) ) => (10 8 10 6) ; для чётных
?
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
13.05.2021, 00:29
Добуквенно так сделать нельзя, потому что с mapcar вообще ничего сделать нельзя. Он как работает, так работает, это стандарт. Он сложит списки поэлементно, и всё.

Можно, например, другую функцию подсовывать.

Что вы имеете в виду под "для нечётных"? 10 - чётное число. Для нечётных кого? Может, вам правда нужна чётность номера в списке?
2
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176
13.05.2021, 10:20  [ТС]
Цитата Сообщение от helter Посмотреть сообщение
Может, вам правда нужна чётность номера в списке?
думаю да, нужно применять для (не)чётных по номеру элемента в списке, а не по значению элемента
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
13.05.2021, 13:03
А, ну такие вам уже написали.
0
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176
13.05.2021, 14:13  [ТС]
helter, а что означает # перед '+ или '- ?
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
13.05.2021, 16:29
+ это символ, то есть "лисповое слово". defun, f1, +, mapcar - это всё символы. Символы могут служить именами объектов. Например, вы пишете (+ a b). Это не значит, что надо складывать "слова" a и b. Это значит, надо взять значение переменной по имени a и значение переменной по имени b. Когда символ сам по себе стоит в выражении не на первом месте, смысл в этом - "взять переменную по имени".

Также символ может быть именем функции. Когда вы пишете (mapcar #'+ ...), здесь смысл "взять функцию по имени mapcar". Вы пишете не саму функцию mapcar, а её имя. Аналогично, (+ a b) - это "взять функцию по имени +, взять значение переменной по имени a, взять значение переменной по имени b и применить функцию к этим двум значениям".

Важно, что в CL "значение переменной по имени" и "функция по имени" не совпадают по смыслу. У вас может быть переменная по имени list со значением (1 2 3), и это никак не конфликтует с тем, что существует встроенная функция по имени list.

Но функция - это такой же объект, как любой другой: как число или конс-ячейка или хеш-таблица и т. п. И иногда мы хотим не применять функцию, а просто что-то сделать с этим объектом. Например, + - имя функции сложения. Как получить саму функцию сложения? Для этого перед символом мы пишем #'. То есть #'+ - это буквально значит "функция по имени +".

Когда мы используем mapcar, мы не хотим ничего складывать сами. Мы хотим чтобы mapcar сам сложил, что нужно, и нам дал бы окончательный ответ. Поэтому функцию сложения нам вызывать самим не надо, а достаточно передать mapcar-у, чтобы он вызывал.

Связь символов с объектами называется пространством имён. То, что я сказал, значит, что в CL пространство имён функций не совпадает с пространством имён переменных. Новичков это иногда путает, но таков дизайн языка.
3
 Аватар для _sg
4710 / 4405 / 380
Регистрация: 12.05.2012
Сообщений: 3,102
13.05.2021, 21:01
Решетка с последующей одинарной кавычкой #' является сокращенной записью специального оператора function, то есть (mapcar #'+ '(10 10 10) '(1 2 3)) эквивалентно (mapcar (function +) '(10 10 10) '(1 2 3)):
Lisp
1
2
3
4
> (mapcar #'+ '(10 10 10) '(1 2 3))
(11 12 13)
> (mapcar (function +) '(10 10 10) '(1 2 3))
(11 12 13)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2021, 21:01
Помогаю со студенческими работами здесь

Работа с mapcar
Привет всем! Помогите пожалуйста решить задачку, очень нужно: Используя функционал MAPCAR, определить функцию, отображающую свой...

Mapcar функции из файла
Написать программу ввода списка имен функций, ввода списка данных и получения списка результатов, используя функцию mapcar. Результат...

Mapcar для sin
Здравствуйте. Передо мной стоит следующая задача: Написать программу ввода списка имен функций, ввода списка данных и получения списка...

Книги или другой источник, где описана история версий Lisp и Common Lisp
Доброго времени суток.Такой вопрос,знаете какой-нибудь источник,где описана история версий Lisp и Common Lisp.Только не всякие...

Организация циклов в Lisp (bee lisp demo)
разбираюсь с простыми задачами, эти пока не знаю, как решать... помогите пожалуйста. 1. Слова в предложении разделены пробелами....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru