|
0 / 0 / 0
Регистрация: 16.10.2018
Сообщений: 3
|
|||||||||||
Common Lisp Избавиться от вывода Nil14.05.2021, 09:34. Показов 4030. Ответов 9
Метки нет (Все метки)
Здравствуйте!
Имеется функция find-path, которая занимается поиском Эйлерова пути в неориентированном графе. В параметр x передается точка с которой нужно начать поиск пути, в параметр graph сам граф. На выходе функция печатает все возможные пути в заданном графе. Но функция имеет особенность, что даже если удалось найти пути, она в конце все равно выводит nil. Кликните здесь для просмотра всего текста
Можете помочь, переделать функцию find-path так, чтобы если пути найдены, в конце печати всех элементов выводить T, а если пути не найдены выводить Nil. Листинг программы: Кликните здесь для просмотра всего текста
0
|
|||||||||||
| 14.05.2021, 09:34 | |
|
Ответы с готовыми решениями:
9
nil
|
|
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
||||||||||||
| 14.05.2021, 10:01 | ||||||||||||
|
Знаете ли вы, что такое REPL? Это read evaluate PRINT loop. Вы забиваете в REPL выражение (find-path '1 '((1 2) (1 3) (2 1) (2 3) (3 1) (3 2)) nil). REPL его сначала читает, потом вычисляет, потом печатает результат, потом ждёт нового ввода, и так до бесконечности. В процессе вычисления выражения тоже может что-то печататься самим выражением, но результат всегда печатается не самим выражением, а REPLом. Таким образом, проблемы с вашей функции нет, она не печатает ничего лишнего. Например, если вы используете её в программе, то программа будет печатать только пути, а NIL печатать не будет. Если вас эстетически беспокоит, что в REPLе печатается значение функции, хотя по вашей задумке она не возвращает осмысленного значения, можете в явном виде вернуть из неё ноль значений, поставив в конце (values):
Но, по-моему, смысла в этом нет. Не всегда можно вернуть осмысленное значение, и стандартные функции часто в таком случае возвращают nil, а ноль значений - никогда. То есть имеет смысл пересмотреть свои эстетические соображения, чтобы они более соответствовали стандарту. Лучше обратите внимание на форматирование кода. По вашему коду невозможно различить, где у if-а ветка "да", где ветка "нет"; невозможно отличить аргументы внутреннего find-path от аргументов rm-edge. Скобки - для компьютера, для людей - отступы. Обратите внимание, что с отступами всё видно. Тоже так делайте. То есть вам не надо ничего делать, этим занимается Emacs.
3
|
||||||||||||
|
Супер-модератор
|
||||||
| 14.05.2021, 10:26 | ||||||
![]()
1
|
||||||
|
0 / 0 / 0
Регистрация: 16.10.2018
Сообщений: 3
|
||||||||||
| 14.05.2021, 11:17 [ТС] | ||||||||||
|
Вариант с (values) к сожалению не подходит под требования преподавателя, но как я понимаю выводить T после вывода всех путей, не получится? Ну либо придется переписывать функцию find-path, чтобы она рекурсивно формировала список всех возможных путей, а потом выводить получившийся список циклом foreach? Листинг всей программы: Кликните здесь для просмотра всего текста
Добавлено через 2 минуты Добавлено через 6 минут
0
|
||||||||||
|
4708 / 4403 / 380
Регистрация: 12.05.2012
Сообщений: 3,101
|
||||||
| 14.05.2021, 11:32 | ||||||
1
|
||||||
|
Супер-модератор
|
|||||||
| 14.05.2021, 12:09 | |||||||
1
|
|||||||
|
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|||||
| 14.05.2021, 13:30 | |||||
|
Но на самом деле рецепт простой: емакс + здравый смысл. Возможно, в вашей методичке не написано, что для лиспа нужен особый редактор. Тогда я вам это скажу. Лисп надо писать в емаксе. Он расставит отступы, как положено. А здравый смысл - ну, скажем, неужели вы сами можете проанализировать, что передаётся во внутренний find-path? А раз не можете вы, автор кода, то и никто не может. Чтобы стало ясно, надо разбить строки или определить локальные переменные. Но это спорная эстетическая позиция. Скажем, стандартные выражения (что функции, что нефункции) стараются вернуть что-то полезное. Например, print возвращает напечатанный объект (поэтому удобно дебажить принтами). Но если вернуть вообще нечего, по-моему, возвращают nil. Навскидку: format и результат циклов по умолчанию. Nil вовсе не всегда означает неуспех, это и пустой список тоже. Nil по-латински - "ничто". Если нечего вернуть, возвращаем ничто. Хотя, конечно, из-за таких пустяков нет смысла спорить с преподавателем.Добавлено через 17 минут От напечатанных значений толка нет. Их человек увидит, а компьютер не знает о них. Вы их никак не можете анализировать. Например, вас спросят: "а какой из этих путей И такое соображение. Есть задача - найти эйлеровы пути, и есть задача вывести их. Вы эти задачи прибили гвоздями друг к другу. Это всегда чревато. Например, вы вроде бы умеете находить эйлеровы пути, а я скажу: "Вот вам библиотека для рисования png, нарисуйте мне эти пути стрелочками на графе!" Или: "У нас будет веб-сервис нахождения эйлеровых путей, нам нужен REST-хендлер, возвращающий их в JSON". А ваша функция для этого абсолютно бесполезна. Вы потрудились, написали алгоритм, но прибив его гвоздями к конкретному способу вывода, вы похоронили его в недрах find-path. Добавлено через 2 минуты Есть dolist или loop на все случаи жизни.Добавлено через 11 минут
3
|
|||||
|
0 / 0 / 0
Регистрация: 16.10.2018
Сообщений: 3
|
||||||||
| 14.05.2021, 15:12 [ТС] | ||||||||
|
Всем спасибо!
Выбрал следующее решение: в функции find-path добавил (values T), теперь функция возвращает всегда T, даже если путь не будут найден, что не очень хорошо я считаю, ведь если нет путей, то логичней вывести nil. Но так как я инкапсулирую данную функцию в функции euler-path, то там происходит проверка на существование пути, то такое решение в принципе имеет право на жизнь, на зачет думаю точно. Но правда пришлось изменить функцию euler-path, а именно добавить условие, которое проверяет, что если есть две вершины, которые имеют нечетную степень, то согласно теореме, путь возможен только из данных вершин, и можно будет вызывать функцию find-path передавая нечетную вершину, а иначе выводит предупреждение "Path from the given point is not possible", ну чтоб не выводить просто T. Вот такой код получился: Кликните здесь для просмотра всего текста
Добавлено через 4 минуты
0
|
||||||||
|
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
||
| 14.05.2021, 15:24 | ||
|
CL поддерживает такую нечасто встречающуюся штуку как множественные значения. Обычно выражение возвращает одно значение, но может возвращать и несколько. Не один список, а буквально несколько значений. Форма values как раз служит для возврата нескольких значений. Например, (values 1 2 3) возвращает три значения: 1, 2, 3. Выражение (values t) возвращает одно значение: t. Написать (values t) и t - это абсолютно одно и то же. Код в CL пишут маленькими буквами, в том числе t. Раньше писали большими, но давно это было, лет сорок назад.
3
|
||
|
Супер-модератор
|
||||||
| 14.05.2021, 15:57 | ||||||
|
В HomeLisp этот код выглядит так:
1
|
||||||
| 14.05.2021, 15:57 | |
|
Помогаю со студенческими работами здесь
10
Поясните строку q^.next := nil; Alamofire response nil Вылавливание Nil в функции
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|