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

Функциональное программирование на Lispe

09.04.2020, 11:18. Показов 11716. Ответов 146
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Начал смотреть другой курс по функциональному программированию на Lisp
https://www.youtube.com/watch?... ebDaSS1P33
Смотреть желательно в HD на большом мониторе, иначе код может быть не виден из-за мелкого шрифта и придется скачивать программой (в Windows это Ummy Video Downloader) делать скриншот и увеличивать.
И там сказано, что Lisp предполагает, что Вы пишите в чисто функциональном стиле, чисто функциональной парадигме. А по другому если программировать, немного искажая далее сказанное, является дурным тоном. Что Вы об этом думаете?

Это не тот видео курс, о котором упоминал ранее
https://www.youtube.com/playli... zm9GG4wOfU
https://openedu.ru/course/ITMOUniversity/FPBC/
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2020, 11:18
Ответы с готовыми решениями:

Функциональное программирование
Написать функцию, которая запрашивает у пользователя ФИО студента группы (список группы составлен ранее) и выдает следующие данные о нем: ...

Функциональное программирование на языке Lisp
Добрый вечер, всем форумчанин! Тема №1: Определение простых рекурсивных функций обработки списков Задание 1: (COUNT3 a x)...

Харрисон Введение в функциональное программирование (книга с примерами на языке ML)
Где брать дистрибутив ML для изучения примеров? Что потом? Какая применимость этого? Можно ли писать полезные современные программы, делать...

146
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
13.04.2020, 15:18
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от supmener Посмотреть сообщение
На русском в пределах доступности есть по функциональному программированию на ML одна книга, а другая по самому языку. Какую именно Вы имели в виду?
Я, честно говоря, по-английски. Мне посоветовали вот эту книгу: https://www.cl.cam.ac.uk/~lp15... tails.html Называется ML for the Working Programmer, но по уровню, скорее, для студентов.

Цитата Сообщение от supmener Посмотреть сообщение
А почему так?
А потому что есть специальные функции для прибавления и вычитания единицы. А почему они в нём есть? Предполагаю, потому что пригождаются в функциональном стиле итерирования - рекурсией или do.

Добавлено через 2 минуты
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
И никаких вам if-elif-else и прочего…
Не, это стилистический косяк, который я забыл. На самом там нужно использовать if. Он имеет вид (if <условие> <выражение-да> <выражение-нет>), семантически это тернарный оператор. А cond - множественное ветвление.

Добавлено через 2 минуты
Ой. Там же три ветки. Тогда действительно нужен cond. Но что это за факториал такой, это ерунда а не факториал.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
13.04.2020, 15:39
Цитата Сообщение от helter Посмотреть сообщение
А cond - множественное ветвление.
Мне питон роднее…

Python
1
2
3
4
5
6
def f(x):
    if x == 0:
        return 1
    if x < 0:
        return 0
    return x * f(x - 1)
Или:
Python
1
2
3
4
5
6
7
def f(x):
    if x == 0:
        return 1
    elif x < 0:
        return 0
    else:
        return x * f(x - 1)
Добавлено через 8 минут
Хотя, кажется, в go оператор switch может быть выражением:
Code
1
2
3
4
5
6
7
func f(x int) int {
    return switch {
        case x == 0: 1
        case x < 0: 0
        default: x * f(x - 1)
    }
}
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
13.04.2020, 16:20
Да, лисповый cond и такой switch эквивалентны. А с питоном есть разница. Я тут умозрительно заявлял, что CL и Python более-менее эквивалентны в отношении к функциональному программированию. Но наличие statement-ов, конечно, удаляет от него Python. Не подумал о них. (Как обычно - переходишь к конкретике и оказывается, что кучу всего не учёл.) Но выражение - тоже, в принципе, удобно. Например, если бы мы захотели сохранить результат в переменную перед возвращением - в питоне мы должны в каждой ветке присвоить ей значение, потому что ветки - это ветки исполнения. Но достаточно естественно мыслить и в терминах веток вычисления: "результат будет 1, если x == 0, а в противном случае...". Если бы не было третьей ветки (что за факториал с тремя ветками???), можно было бы элегантно, на мой взгляд, написать
Python
1
2
def f(x):
    return 1 if x == 0 else x * f(x - 1)
2
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
13.04.2020, 16:32
Нашёл реальный рабочий пример "cond". PL/SQL:

Oracle 11 SQL
1
2
3
4
5
6
7
8
CREATE OR REPLACE FUNCTION f(x IN NUMBER) RETURN NUMBER IS
BEGIN
    RETURN CASE
         WHEN x = 0 THEN 1
         WHEN x < 0 THEN 0
         ELSE x * f(x - 1)
    END;
END;
condition_1 .. condition_n должны быть одного типа. Условия оцениваются по порядку, одно за другим. После того, как условие примет значение TRUE (истина), оператор CASE вернет результат, и не будет оценивать условия дальше.
1
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
13.04.2020, 16:45
Вообще, cond можно использовать для чего угодно. Каждая ветка в нём берётся в скобки - именно потому, что в ней может быть более одного выражения. У него такой синтаксис:
Lisp
1
2
3
(cond (<условие 1> <выражение 1.1> <выражение 1.2> ...)
      ...
      (<условие k> <выражение k.1> <выражение k.2> ...))
Можно и присвоить что-нибудь, и напечатать - то есть можно cond использовать так же, как if ... elif ... else. Но объявлять переменную и присваивать ей значение, конечно, нет охоты, если можно сразу вернуть вычисленное значение. А несколько точек выхода из функции лисп не очень любит. (Впрочем, Вирт тоже не любит.)
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
13.04.2020, 23:25
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
кажется, в go оператор switch может быть выражением
Не в Go, но в Kotlin:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
fun f(x: Int): Int {
    return when {
        x == 0 -> 1
        x < 0  -> 0
        else   -> x * f(x-1)
    }
}
 
fun g(x: Int): Int = when {
    x == 0 -> 1
    x < 0  -> 0
    else   -> x * g(x-1)
}
0
Заблокирован
14.04.2020, 01:09
Цитата Сообщение от korvin_ Посмотреть сообщение
Не в Go, но в Kotlin:
В Rust тоже.

C++ (Qt)
1
2
3
4
5
6
7
let x: u8 = 10;
let var = match x {
 
x  if x > 5 && x < 10 => 50,
x  if x >= 10  => 100,
 
}
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
14.04.2020, 08:20  [ТС]
В 5 видео канала Pavel Stepanov после примера с факториалом пример про числа Фибоначчи. И не могу набрать строку кода, как на видео. Скобки не совпадают и начало строки как то не так выглядит.
Вот первая строка вверху, после приветствия LISP
Lisp
1
[1]> <(<= x 0)0)((eq x 1)1)((eq x 2)1)(T(+(fib(- x 1))(fib(- x 2))))))
Как поправить?
Сейчас скриншот добавлю.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
14.04.2020, 08:31  [ТС]
https://youtu.be/2oPhPZ9X7jE?t=8m11s
Вложения
Тип файла: zip Лекция 5 Фибоначчи 1.zip (163.8 Кб, 2 просмотров)
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.04.2020, 08:50
И ты это спрашиваешь у того, кто ни разу в жизни не писал на листе?

Lisp
1
2
3
4
5
6
7
8
(defun fib(x)
  (cond 
    ((<= x 0) 0)
    ((eq x 1) 1)
    ((eq x 2) 1)
    (T …)
  )
)
Добавлено через 2 минуты
где … - это выражение:
Lisp
1
2
3
4
(+
  (fib(- x 1))
  (fib(- x 2))
)
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
14.04.2020, 08:53  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
И ты это спрашиваешь у того, кто ни разу в жизни не писал на листе?
Нет, задаю вопрос тому, кто много раз писал на Лиспе.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38210 / 21143 / 4313
Регистрация: 12.02.2012
Сообщений: 34,757
Записей в блоге: 14
14.04.2020, 09:18
Цитата Сообщение от supmener Посмотреть сообщение
И не могу набрать строку кода, как на видео.
- это на видео так набрано?... вот это паскудство
Lisp
1
(<= x 0)0)((eq x 1)1)((eq x 2)1)(T(+(fib(- x 1))(fib(- x 2))))))
???

Вот. В чем проблема-то?

Lisp
1
2
3
(defun fib (n)
    (cond ((<= n 2) 1)
             (t (+ (fib (- n 1)) (fib (- n 2)))))))
Добавлено через 1 минуту
supmener, ты попробуй этим кодом вычислить (fib 100)
2
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
14.04.2020, 09:25  [ТС]
Там потом другой пример идет. До него пока не добрался.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
14.04.2020, 16:02  [ТС]
Почему то не совпадает.
Миниатюры
Функциональное программирование на Lispe  
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.04.2020, 16:05
Там пробел стоит:
Code
1
10.0 3
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38210 / 21143 / 4313
Регистрация: 12.02.2012
Сообщений: 34,757
Записей в блоге: 14
14.04.2020, 17:22
supmener, что и с чем должно совпадать?
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
14.04.2020, 17:26  [ТС]
Подчеркнутое место в программе с аналогичным в книге. Рыжий Лис уже подсказал.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.04.2020, 18:08
Бездумно перепечатывая примеры из книги, вы ничему не научитесь:
Lisp
1
2
3
4
[1]> (/ 10 3)
10/3
[2]> (/ 10.0 3)
3.3333333
Видимо, там показана разница между числами с плавающей точкой (считается нормально) и целыми. Второй питон, кстати имеет такое поведение для целочисленной арифметики, как и многие языки:
Python
1
2
3
4
>>> 10/3
3
>>> 10.0/3
3.3333333333333335
На мой дилетантский взгляд странно, что в липсе такая конструкция валидна:
Lisp
1
2
[1]> (/ 10)
1/10
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38210 / 21143 / 4313
Регистрация: 12.02.2012
Сообщений: 34,757
Записей в блоге: 14
14.04.2020, 18:31
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
На мой дилетантский взгляд странно, что в липсе такая конструкция валидна:
- Common Lisp поддерживает рациональные числа как тип данных:

Lisp
1
2
3
(+ 1/3 1/7)
 
==> 10/21
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
14.04.2020, 18:38  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Бездумно перепечатывая примеры из книги, вы ничему не научитесь:
Там домашнее задание есть для самостоятельной работы.
Миниатюры
Функциональное программирование на Lispe   Функциональное программирование на Lispe   Функциональное программирование на Lispe  

Функциональное программирование на Lispe  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2020, 18:38

Функциональное программирование: ввести фразу на естественном языке и преобразовать ее в список
Задание:написать функцию, которая вводит фразу на естественном языке и преобразует ее в список.

Функциональное программирование: определить, является ли аргумент функции списком элементов/атомов
Определить функции, которые проверяют, является ли их аргумент: a) списком из 2, 3, ..., n элементов; b) cписком из 2, 3, ..., n атомов.

Рекурсивные вычисления в Lispe
по парно менять элементы списка местами

Онлайн-курс "Функциональное программирование: базовый курс" (Common Lisp)
Открытое образование: Онлайн-курс Функциональное программирование: базовый курс В курсе изучаются основы функционального подхода к...

Нужно подсчитать сумму ряда на Lispe
Y=sqrt(3+sqrt(6+sqrt(9+...sqrt(3*n))))


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru