Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755

Как правильно записать Cond?

21.04.2020, 12:30. Показов 2291. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пример отсюда http://www.mari-el.ru/mmlab/ho... index.html не могу запустить.

Значение COND определяется следующим образом:

Выражения < проверка-i >, выполняющие роль предикатов вычисляются последовательно, слева направо, до тех пор, пока не встретится выражение, значением которого не является NIL.

Вычисляется результирующее выражение, соответствующее этому предикату, и полученное значение возвращается в качестве значения всего предложения COND.

Если истинного значения нет, то значением COND
будет NIL.

Обычно в качестве последнего условия пишется t, соответствующее ему выражение будет вычислятся в тех случаях, когда ни одно другое условие не выполняется.

Последнюю строку можно записать: ( t ' atom ) ) )

Пример: ( функция проверяет тип аргумента)
Lisp
1
2
3
4
5
6
7
8
[44]> ( defun classify ( arg )
( cond
( ( null arg ) nil )
( ( list arg ) 'list )
( ( numberp arg ) 'number )
( t 'atom ) )
( classify 'a )
( classify 5 )
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.04.2020, 12:30
Ответы с готовыми решениями:

COND и EQ, как заставить работать вместе? (HomeLisp)
Здравствуйте почему код (defun func(str) (eq (car (str)) (car (cdr (str))))) работает прекрасно, а код (defun func(str) (cond(eq...

Как правильно записать функции в ЛИСПе ?
Написать функцию, вычисляющую значение выражения. Все необходимые переменные передаются как параметры. Задание 1.Линейный...

Как правильно записать функции в ЛИСПе ? / Lisp

39
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,767
Записей в блоге: 14
24.04.2020, 08:43
Студворк — интернет-сервис помощи студентам
supmener, у Морозова, к сожалению, много опечаток...
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
28.04.2020, 11:58  [ТС]
Попытался написать программу. Почему то не получилось .
Lisp
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
30
31
32
33
34
35
36
37
38
39
40
(defun double1 (num)
(cond ((numberp num) ("Число"))
(t ' не-число)))
 
==> DOUBLE1
(double1 4)
 
EVFUN: Не найдена функция "ЧИСЛО"
Функция: "Число" Аргументы: NIL
==> ERRSTATE
 
(defun double1 (num)
(cond ((numberp num) ('"Число"))
(t ' не-число)))
 
==> DOUBLE1
(double1 3)
 
Apply_: (QUOTE "Число") - не является корректным именем функции!
==> ERRSTATE
 
(defun double1 (num)
(cond ((numberp num) ('Число))
(t ' не-число)))
 
==> DOUBLE1
(double1 4)
 
Apply_: (QUOTE ЧИСЛО) - не является корректным именем функции!
==> ERRSTATE
 
(defun double1 (num)
(cond ((numberp num) (' Число))
(t ' не-число)))
 
==> DOUBLE1
(double1 7)
 
Apply_: (QUOTE ЧИСЛО) - не является корректным именем функции!
==> ERRSTATE
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
28.04.2020, 12:03
Цитата Сообщение от supmener Посмотреть сообщение
Почему то не получилось
Вы сами можете ответить на этот вопрос.

Какой вид имеет ветка cond-а? Что стоит на первом месте, что потом?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,767
Записей в блоге: 14
28.04.2020, 12:11
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(defun double1 (num)
  (cond ((numberp num) "число")
            (t "не-число")))
 
 
==> DOUBLE1
 
(double1 1)
==> "число"
 
(double1 "aaa")
==> "не-число"
 
(double1 '(1 2 3))
==> "не-число"
 
(double1 1/2)
==> "число"
 
(double1 0.5)
==> "число"
 
(double1 #C(1 2))
==> "число"
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
28.04.2020, 13:18  [ТС]
А списком как-то можно выводить? Как подправить код, чтобы было списком?
Lisp
1
2
3
4
5
[1]> (defun double1 (num)
    (cond ((numberp num) '("chi"))
           (cond ((numberp num) '("chi"))
            (t '("ne-chi")))) 
)
Добавлено через 1 минуту
Ой, что-то не то написал, сейчас поправлю.

Добавлено через 11 минут
Вот про такой вариант хотел посмотреть. А после того, как увидел, понял, что в принципе, не нужно это.
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
[1]> (defun double1 (num)
        (cond ((numberp num) '(chi))
               (t '(ne-chi))))
 
DOUBLE1
[2]> (DOUBLE1 2)
 
(CHI)
[3]> (DOUBLE1 ds)
 
[4]>(DOUBLE1 'ds)
 
(NE-CHI)
Добавлено через 3 минуты
А как Вы подсказали, тоже оказалось полезным. Благодарю.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,767
Записей в блоге: 14
28.04.2020, 15:42
supmener, если нужно взять список неких объектов и для каждого решить, число это или нет, то можно поступить так:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(defun check-list (any-list)
  (cond ((null any-list) nil)
        ((numberp (car any-list)) (cons 'число (check-list (cdr any-list))))
        (t (cons 'не-число (check-list (cdr any-list)))))) 
 
==> CHECK-LIST
 
(check-list '(1 2 a b 1/2 0.5 (1 2 3)))
==> (ЧИСЛО ЧИСЛО НЕ-ЧИСЛО НЕ-ЧИСЛО ЧИСЛО ЧИСЛО НЕ-ЧИСЛО)
 
;; хотя лучше использовать отображающий функционал - будет лаконичнее:
 
(defun check-list (any-list)
  (mapcar (lambda (x) (if (numberp x) 'число 'не-число)) any-list))
 
==> CHECK-LIST
 
(check-list '(1 2 a b 1/2 0.5 (1 2 3)))
==> (ЧИСЛО ЧИСЛО НЕ-ЧИСЛО НЕ-ЧИСЛО ЧИСЛО ЧИСЛО НЕ-ЧИСЛО)
Но интереснее преобразовать исходный список в список пар (второй элемент пары - признак: число/не число)

Lisp
1
2
3
4
5
6
7
8
9
(defun check-list! (any-list)
  (cond ((null any-list) nil)
        ((numberp (car any-list)) (cons (list (car any-list) 'число) (check-list! (cdr any-list))))
        (t (cons (list (car any-list) 'не-число) (check-list! (cdr any-list)))))) 
 
==> CHECK-LIST!
 
(check-list! '(1 2 a b 1/2 0.5 (1 2 3)))
==> ((1 ЧИСЛО) (2 ЧИСЛО) (A НЕ-ЧИСЛО) (B НЕ-ЧИСЛО) (1/2 ЧИСЛО) (0.5 ЧИСЛО) ((1 2 3) НЕ-ЧИСЛО))
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
29.04.2020, 08:25  [ТС]
Благодарю. Ваши ответы планирую изучить попозже, так как пока другое изучаю.

Вот это не понимаю (прошу показать пример.):

(COND (<t1> <v1>)
(<t2> <v2>)
.
.
.
(<tn> <vn>)

Из книги автора Тюгашев А.А. - Основы программирования. Ч.2-ИТМО (2016), страницы 13-14.
Миниатюры
Как правильно записать Cond?   Как правильно записать Cond?  
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,767
Записей в блоге: 14
29.04.2020, 08:57
Цитата Сообщение от supmener Посмотреть сообщение
Вот это не понимаю (прошу показать пример.):
- а что непонятно? Примеров COND тебе уже много привели.

И в чем суть непонимания?
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
29.04.2020, 09:11  [ТС]
Непонятно в варианте, когда vi отсутствует.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,767
Записей в блоге: 14
29.04.2020, 09:26
Цитата Сообщение от supmener Посмотреть сообщение
Непонятно в варианте, когда vi отсутствует.
- тогда, если ti - не nil, это значение возвращается как результат COND. В принципе это удобно, но в HomeLisp я не реализовал этой возможности
1
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
29.04.2020, 12:05
В ветке может быть и больше одного выражения для вычисления.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,767
Записей в блоге: 14
29.04.2020, 16:49
helter, да... Да в этих методичках чего не понаписано...
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
29.04.2020, 17:12
Я почему вспомнил - удобно ведь. В if единственное выражение, поэтому там приходится писать progn. Поэтому если мне почему-то нужны обе ветки, и в одной из них больше одного выражения, я напишу cond вместо if - целый progn экономится!
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,767
Записей в блоге: 14
29.04.2020, 17:14
helter, да, я люблю COND.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
14.05.2020, 19:16  [ТС]
Почему-то не работает
Lisp
1
2
3
4
5
(defun ko (z) 
(cond 
  ((atom z) 'атом)
  ((numberp z) 'number)
  (t 'no)))
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[2]> (load "c:/c.cl")
;; Загружается файл C:\c.cl...
;; Загружен файл C:\c.cl
T
[3]> (ko 2)
 
*** - SYSTEM::READ-EVAL-PRINT: Character #\u201A cannot be represented in the
      character set CHARSET:CP866
Имеются следующие варианты продолжения:
ABORT          :R1      Прервать главный цикл
Break 1 [4]>
[5]> (load "c:/c.cl")
;; Загружается файл C:\c.cl...
;; Загружен файл C:\c.cl
T
[6]> (ko 'zgzg)
 
*** - SYSTEM::READ-EVAL-PRINT: Character #\u201A cannot be represented in the
      character set CHARSET:CP866
Имеются следующие варианты продолжения:
ABORT          :R1      Прервать главный цикл
Break 1 [7]>
Добавлено через 2 минуты
> (atom 1)
T
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,767
Записей в блоге: 14
14.05.2020, 19:30
Цитата Сообщение от supmener Посмотреть сообщение
*** - SYSTEM::READ-EVAL-PRINT: Character #\u201A cannot be represented in the
      character set CHARSET:CP866
- похоже, из-за русских букв.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
14.05.2020, 19:53
Какой utf-8, это ж виндовая консоль. Ей cp866 подавай.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
24.05.2020, 15:53  [ТС]
Последний вариант, где задействуется последняя строка с t, не работает.
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(defvar xi)
(setf xi 10)
(cond ((listp xi) "spisok eto")
((numberp xi) "eto chislo")
((t "ne poniatno chto"))) 
"eto chislo"
 
(defvar xi)
(setf xi '(qw 12))
(cond ((listp xi) "spisok eto")
((numberp xi) "eto chislo")
((t "ne poniatno chto"))) 
"spisok eto"
 
(defvar xi)
(setf xi 'sd)
(cond ((listp xi) "spisok eto")
((numberp xi) "eto chislo")
((t "ne poniatno chto")))
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
24.05.2020, 19:13
Цитата Сообщение от helter Посмотреть сообщение
Какой utf-8, это ж виндовая консоль. Ей cp866 подавай.
https://superuser.com/question... e-to-utf-8
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
24.05.2020, 19:49  [ТС]
Убрал пару скобок из последней строки и заработало.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.05.2020, 19:49

Как правильно записать предикаты?
допустим имеем следующее DOMAINS name=string PREDICATES elder(name,name) /*X старше Y*/ eldest(name) ...

Как правильно записать формулу?
Как правильно записать формулу \xi ^2\sqrt{1+\xi ^2} ?...чёт никак не соображу...

Как правильно записать в таблицю на Lua
Мне нужно написать функцию которая переводит из десятичной системы в римскую. Но я не уверен правильно ли я создал массив. Мне нужно чтобы...

Как правильно записать опоздание функции через функцию-ножницы, если t!=0 при t>4? Как правую часть записать?
Нужно найти изображение оригинала. Всю суть проблемы написал в заголовке.

E712 comparison to False should be 'if cond is False:' or 'if not cond:'
cena = int(input()) cena2 = int(input()) a = False while cena2 != 0: if a == False: if cena &lt; cena2: c...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть не большие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru