Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 34

Используя функцию DEFUN, определить функцию f (a x)

01.10.2013, 19:56. Показов 3664. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Используя функцию DEFUN, определить функцию f (a x), где a - s-выражение, a x –список, состоящий из 2-3 элементов, которая удаляет из списка x первый элемент, если хотя бы один из элементов равен а, и не изменяет x в остальных случаях.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.10.2013, 19:56
Ответы с готовыми решениями:

Используя функцию DEFUN, определить функцию f (a x)
Используя функцию DEFUN, определить функцию f (a x), где a – S- выражение, а x - список, состоящий из 2-3 элементов которая заменяет на a...

Используя функцию DEFUN, определить функцию
Используя функцию DEFUN, определить функцию f (a x), где a – S- выражение, а x - список, состоящий из 2-3 элементов которая уменьшает...

Используя функцию DEFUN, определить функцию
Используя функцию DEFUN, определить функцию f (a x), где a – S- выражение, а x - список, состоящий из 2-3 элементов которая уменьшает...

27
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
01.10.2013, 20:54
Lisp
1
2
3
4
5
6
7
8
9
(defun f (a x) (if (member a x) (cdr x) x))
 
==> f
(f 2 '(1 2 3 4))
 
==> (2 3 4)
(f 7 '(1 2 3 4))
 
==> (1 2 3 4)
1
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
03.10.2013, 17:35
Цитата Сообщение от mishalsk Посмотреть сообщение
Используя функцию DEFUN
defun не может быть функцией никак. defun - макрос.

P.S.
Если препод говорит, что defun - функция - меняйте ВУЗ
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
03.10.2013, 17:57
Цитата Сообщение от nullxdth Посмотреть сообщение
defun не может быть функцией никак.
- точнее - не может быть функцией, вычисляющей аргументы. Но может быть специальной функцией (не обязательно макросом).
1
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
03.10.2013, 18:14
Цитата Сообщение от Catstail Посмотреть сообщение
- точнее - не может быть функцией, вычисляющей аргументы. Но может быть специальной функцией (не обязательно макросом).
В CL defun не может быть "special operator". В этом нет никакого смысла. Да и в стандарте написано, что defun - макрос: http://www.ai.mit.edu/projects... defun.html.

Добавлено через 1 минуту
Цитата Сообщение от Catstail Посмотреть сообщение
не может быть функцией, вычисляющей аргументы.
А вызываемая функция и не может вычислять свои аргументы, аргументы вычисляются строго слева на право и до того, как передаётся управление в функцию.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
03.10.2013, 18:17
Цитата Сообщение от nullxdth Посмотреть сообщение
Да и в стандарте написано, что defun - макрос:
- а не все реализации следуют стандартам... Кстати, на "конечном результате" это (в данном случае) отражается не сильно.

Цитата Сообщение от nullxdth Посмотреть сообщение
В этом нет никакого смысла.
- почему?

Добавлено через 48 секунд
Цитата Сообщение от nullxdth Посмотреть сообщение
А вызываемая функция и не может вычислять свои аргументы, аргументы вычисляются строго слева на право и до того, как передаётся управление в функцию.
- знаю...
0
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
03.10.2013, 18:31
Цитата Сообщение от Catstail Посмотреть сообщение
а не все реализации следуют стандартам...
Все ведущие реализации следуют стандартам, иначе тяжко писать переносимые библиотеки.
Цитата Сообщение от Catstail Посмотреть сообщение
Кстати, на "конечном результате" это (в данном случае) отражается не сильно.
Согласен.
Цитата Сообщение от Catstail Посмотреть сообщение
почему?
Следуя принципу - "ничего лишнего". Зачем добавлять новый special operator, если defun легко реализуется макросом.
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
03.10.2013, 18:38
Цитата Сообщение от nullxdth Посмотреть сообщение
Все ведущие реализации следуют стандартам, иначе тяжко писать переносимые библиотеки.
Реализация CL и реализация другого диалекта лиспа — разные вещи.
elisp не следует ANSI CL, как и Racket и различные реализации Scheme. Кроме того, в схеме define как раз-таки специальный оператор, потому что не может быть выражен ни через что. А в picolisp, кажется, нет разницы между функцией и макросом.

В случае ТС, конечно, это скорее всего макрос MuLisp (уж больно часто он мелькает в темах по лабораторкам и в основном преподы, использующие CL, достаточно грамотны).
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
03.10.2013, 18:51
В muLisp мне не удалось понять, чем является defun. Похоже, что это как раз не макрос.
0
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
03.10.2013, 18:54
Цитата Сообщение от korvin_ Посмотреть сообщение
А в picolisp, кажется, нет разницы между функцией и макросом.
Как такое может быть?
Цитата Сообщение от Catstail Посмотреть сообщение
В muLisp мне не удалось понять, чем является defun. Похоже, что это как раз не макрос.
В любом случае, никак не функция
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
03.10.2013, 19:10
Цитата Сообщение от nullxdth Посмотреть сообщение
В любом случае, никак не функция
- в "доброе старое время" считалось, что функции, встроенные в ядро, бывают двух видов: типа SUBR (Обычные; все их аргументы вычисляются, или, допуская вольность, это "функции, вычисляющие свои аргументы". Число аргументов фиксировано). Все остальные функции относились к типу FSUBR (Специальные; Не все их аргументы вычисляются; число их может быть неопределенным). Приняв эту классификацию, приходим к тому, что в Лиспе "нет ничего, кроме функций", и это методически очень оправдано.

А без этого приходится привлекать определения типа "специальная форма", что нарушает стройность. Введение макро ситуацию не меняет: пусть в CL COND - это макро. Но первична if, а что есть if? Специальная форма...

Реализации могут быть разными... Например, в CL логические функции AND и OR - макросы (и это не позволяет использовать их в конструкции типа (apply 'AND ...). А в HomeLisp (я ни в коем случае не ставлю HomeLisp рядом с профессиональными реализациями!) AND и OR - это функции типа FSUBR (c переменным числом аргументов; аргументы вычисляются в теле и последовательно, что позволяет обеспечить примитивную "лень". И вызов (apply 'AND ...) вполне возможен.

Что-то много букв написал...
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
03.10.2013, 19:21
Цитата Сообщение от nullxdth Посмотреть сообщение
Как такое может быть?
Вычислять или нет тот или иной аргумент решает функция (ее автор точнее =) ). Вот тут есть некоторая инфа:
http://software-lab.de/doc/tut.html#fun
http://software-lab.de/doc/faq.html#macros

Другой пример — Tcl, хотя там это несколько по-другому.

Добавлено через 7 минут
Цитата Сообщение от Catstail Посмотреть сообщение
А без этого приходится привлекать определения типа "специальная форма", что нарушает стройность
Ничего они не нарушают, они определяют ядро языка.

Цитата Сообщение от Catstail Посмотреть сообщение
Реализации могут быть разными... Например, в CL логические функции AND и OR - макросы (и это не позволяет использовать их в конструкции типа (apply 'AND ...). А в HomeLisp (я ни в коем случае не ставлю HomeLisp рядом с профессиональными реализациями!) AND и OR - это функции типа FSUBR (c переменным числом аргументов; аргументы вычисляются в теле и последовательно, что позволяет обеспечить примитивную "лень". И вызов (apply 'AND ...) вполне возможен.
И добро пожаловать в ад непредсказуемой последовательности произведения побочных эффектов.
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
03.10.2013, 21:02
Цитата Сообщение от korvin_ Посмотреть сообщение
И добро пожаловать в ад непредсказуемой последовательности произведения побочных эффектов.
- с чего бы???

Добавлено через 44 секунды
Цитата Сообщение от korvin_ Посмотреть сообщение
Ничего они не нарушают, они определяют ядро языка.
- ценой ввода лишнего понятия...
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
03.10.2013, 22:21
Цитата Сообщение от Catstail Посмотреть сообщение
с чего бы???
С того, что каждая функция как хочет, так и вычисляет свои аргументы, поэтому нет уверенности, вычислится то или иное выражение, переданное в качестве аргумента или нет и когда оно вычислится. Подробней об этом рассказывается ближе к концу главы о потоках в SICP.

Когда мы переходим к конкурентным программам или взаимодействию с внешним разделяемым мутабельным ресурсом (БД например), все становится еще сложней. Можно также прочитать про ленивость + БД в Хаскелле, там эту проблему решает рантайм и монады, но проблема-то есть.

Макросы же выполняются на этапе компиляции, это гарантирует, что в рантайме никаких подводных камней не вылезет + оптимизация скорости. loop например так же эффективен, как и do, и ручное tagbody+go. А как будет тормозить аналогичный loop в том же picolisp?

Цитата Сообщение от Catstail Посмотреть сообщение
- ценой ввода лишнего понятия...
В чем лишнесть? В том, что вместо FSUBR это называется Special Form? Зато обычные функции умеют любое количество аргументов =)

Добавлено через 14 минут
А ленивые вычисления можно и на Scheme/CL сделать с помощью макр.
2
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
04.10.2013, 00:26
Цитата Сообщение от korvin_ Посмотреть сообщение
Другой пример — Tcl, хотя там это несколько по-другому.
Нет. В Tcl в этом смысле, всё как в CL {} - квота, [] - вызов функции (команды). И сама команда никак не может повлиять на вычисления аргументов (ну конечно, кроме случая, когда аргументы квотированы и функция решает, что там и когда вычислить).

Добавлено через 30 секунд
Цитата Сообщение от korvin_ Посмотреть сообщение
А ленивые вычисления можно и на Scheme/CL сделать с помощью макр.
В точеку!
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
04.10.2013, 08:11
Цитата Сообщение от nullxdth Посмотреть сообщение
Нет. В Tcl в этом смысле, всё как в CL {} - квота, [] - вызов функции (команды). И сама команда никак не может повлиять на вычисления аргументов (ну конечно, кроме случая, когда аргументы квотированы и функция решает, что там и когда вычислить).
Не как в CL: http://ideone.com/T3lniO
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
04.10.2013, 09:03
Цитата Сообщение от korvin_ Посмотреть сообщение
С того, что каждая функция как хочет, так и вычисляет свои аргументы
- а разве специальные формы поступают не так?

Про "лень" - это я больше для красного словца... Просто при реализации AND (например) первый же аргумент, равный Nil порождает завершение.

Цитата Сообщение от korvin_ Посмотреть сообщение
Макросы же выполняются на этапе компиляции, это гарантирует, что в рантайме никаких подводных камней не вылезет
- если уж меня поправляют, то позволю и я... Не выполняются, вероятно, а раскрываются... Да и проблем от слегка неверно написанных макро в рантайме - пруд пруди. Об этом у Грэма - целая глава.

Но в целом - все равно спасибо за критику!
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
04.10.2013, 11:00
Цитата Сообщение от Catstail Посмотреть сообщение
- а разве специальные формы поступают не так?
Специальных формограниченное небольшое число.

Цитата Сообщение от Catstail Посмотреть сообщение
Не выполняются, вероятно, а раскрываются...
Это не обязательно, макра -- это просто функция, она может ни во что не раскрываться. Хотя обычно так не делают конечно.

Цитата Сообщение от Catstail Посмотреть сообщение
Да и проблем от слегка неверно написанных макро в рантайме - пруд пруди. Об этом у Грэма - целая глава.
Ну это в CL, да. Однако же в PCL показывается, как решить проблему с символами.
1
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
04.10.2013, 16:21
Цитата Сообщение от korvin_ Посмотреть сообщение
Не как в CL: http://ideone.com/T3lniO
Но ведь этот пример никак не демонстрирует возможность tcl-процедуры вычислять свои аргументы (tcl этого и не может, если явно eval-ом не вычислить квотированный блок).
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env tclsh
 
proc f {} {
    puts {starting f}
    expr 1
}
 
proc g {a} {
    puts {starting g}
    puts $a
}
 
g [f]
 
# starting f
# starting g
# 1
Из этого примера видно, что f вычисляется до передачи управления g.
Разница в том, что символы в CL записанные явным образом - вычисляются, а в Tcl они квотированы. Для взятия значения из переменной в tcl нужно приписать $ к индетификатору.

Добавлено через 4 минуты
И порядок вычисления аргументов также как и в CL определён слева на право:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env tclsh
 
proc f1 {} {
    puts f1
    expr 1
}
 
proc f2 {} {
    puts f2
    expr 2
}
 
proc f3 {} {
    puts f3
    expr 3
}
 
proc f {a b c} {
    puts f
    puts[list $a $b $c]
}
 
f [f1] [f2] [f3]
 
# f1
# f2
# f3
# f
# 1 2 3
Добавлено через 35 минут
Цитата Сообщение от Catstail Посмотреть сообщение
Да и проблем от слегка неверно написанных макро в рантайме - пруд пруди.
Но ведь после того, как раскроются все макросы в коде останутся только функции и special forms поведение которых строго определено, отлаживать это хозяйство становится проще.

Добавлено через 24 секунды
Цитата Сообщение от korvin_ Посмотреть сообщение
Ну это в CL, да. Однако же в PCL показывается, как решить проблему с символами.
О какой проблеме идёт речь?

Добавлено через 4 минуты
Цитата Сообщение от Catstail Посмотреть сообщение
если уж меня поправляют, то позволю и я...
Да я не потехи ради, не обижайтесь Исключительно ради ясности.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
04.10.2013, 16:22
nullxdth, все ОК, спасибо!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.10.2013, 16:22
Помогаю со студенческими работами здесь

Используя функцию DEFUN, определить функцию f (a x)
Используя функцию DEFUN, определить функцию f (a x), где a - s-выражение, a x –список, состоящий из 2-3 элементов, которая подсчитывает...

Используя функцию DEFUN, определить фукцию f (a x)
Используя функцию DEFUN, определить фукцию f (a x), где а - S - выражение, а x - список, состоящий из 2-3 элементов. вариант: заменяет...

Clojure Используя функцию DEFUN, определить функцию f (a x)
Используя функцию DEFUN, определить функцию f (a x), где a – S-выражение, а x - список, состоящий из 2-3 элементов, которая Выдает...

Clojure Используя функцию DEFUN, определить функцию f (a x)
Используя функцию DEFUN, определить функцию f (a x), где a - S-выражение, а x - список, состоящий из 2-3 элементов, которая выдает номер...

Clojure Используя функцию Defun, определить функцию f(a x), где а-S- выражение, а х-список, состоящий из 2-3 элементов, которая заменяет на а все атомы списка
1)Используя функцию Defun, определить функцию f(a x), где а-S- выражение, а х-список, состоящий из 2-3 элементов, которая заменяет на а все...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru