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

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

09.04.2020, 11:18. Показов 10382. Ответов 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
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
09.04.2020, 11:31
Цитата Сообщение от supmener Посмотреть сообщение
И там сказано, что Lisp предполагает, что Вы пишите в чисто функциональном стиле, чисто функциональной парадигме. А по другому если программировать, немного искажая далее сказанное, является дурным тоном. Что Вы об этом думаете?
Что там чушь сказана.
2
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
09.04.2020, 12:25
Цитата Сообщение от supmener Посмотреть сообщение
Что Вы об этом думаете?
Я думаю, что вы не читаете, что на форуме вам пишут умные люди. Например, тут:
Основы синтаксиса Lisp на нескольких страницах
Там я забыл упомянуть ещё такую "мелочь" как оптимизация хвостовой рекурсии - шибболет функциональщины. В CL её - нет! Нужен цикл - надо писать цикл.
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
09.04.2020, 13:06  [ТС]
А Homelisp тоже не функциональная реализация?

Добавлено через 5 минут
Цитата Сообщение от helter Посмотреть сообщение
Там я забыл упомянуть ещё такую "мелочь" как оптимизация хвостовой рекурсии - шибболет функциональщины. В CL её - нет! Нужен цикл - надо писать цикл.
Значит на Scheme надо писать?

Добавлено через 7 минут
А не подскажите, почему Гвидо против хвостовой рекурсии? Что то не понял http://neopythonic.blogspot.co... ation.html
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
09.04.2020, 13:12
Цитата Сообщение от supmener Посмотреть сообщение
Значит на Scheme надо писать?
В смысле "надо?" Если вы хотите познакомиться с функциональным программированием - конечно, Scheme подходит больше, чем CL. Вероятно, Racket ещё лучше, хотя бы потому что он побольше. Но я уже не раз, вроде бы, писал, что лучше всего взять настоящий функциональный язык - хаскел там или ML (кстати, читаю сейчас книжку про ML, забавно); с чего бы мне теперь говорить иначе?
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
09.04.2020, 13:15  [ТС]
А если взять SBCL?
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
09.04.2020, 13:31
Цитата Сообщение от supmener Посмотреть сообщение
А не подскажите, почему Гвидо против хвостовой рекурсии? Что то не понял http://neopythonic.blogspot.co... ation.html
По-моему, его аргумент - "а нафига?"

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

Добавлено через 9 минут
Цитата Сообщение от supmener Посмотреть сообщение
А если взять SBCL?
Это не язык, это реализация Common Lisp.

Если вы ограничитесь задачами со списками длины < 10, то вряд ли у вас переполнится какой-либо стек. Худшее, что случится - что вы поверите, что так, рекурсивно, и надо писать на CL, и не дай бог выпустите методичку, в которой напишете "в лиспе есть циклы, но основной способ итерирования - рекурсия" или видеокурс "на лиспе надо программировать только функционально". А так - дело ваше.
2
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
09.04.2020, 13:47
Цитата Сообщение от supmener Посмотреть сообщение
А не подскажите, почему Гвидо против хвостовой рекурсии?

Не по теме:

Потому что он — анскильный неосилятор.



First, as one commenter remarked, TRE is incompatible with nice stack traces: when a tail recursion is eliminated, there's no stack frame left to use to print a traceback when something goes wrong later. This will confuse users who inadvertently wrote something recursive (the recursion isn't obvious in the stack trace printed), and makes debugging hard. Providing an option to disable TRE seems wrong to me: Python's default is and should always be to be maximally helpful for debugging. This also brings me to the next issue:
1) Полный стэктрейс обычно и не нужен. Если ему так нравятся стектрейсы, пусть пишет на Java/Groovy.

2) Юнит-тесты нужно писать.

Second, the idea that TRE is merely an optimization, which each Python implementation can choose to implement or not, is wrong. Once tail recursion elimination exists, developers will start writing code that depends on it, and their code won't run on implementations that don't provide it: a typical Python implementation allows 1000 recursions, which is plenty for non-recursively written code and for code that recurses to traverse, for example, a typical parse tree, but not enough for a recursively written loop over a large list.
А зачем давать выбор — реализовывать или нет? В Scheme необходимость TCO прописана в спецификации языка. Для функциональных языков (ML, Haskell, Erlang) она тоже строго обязательна.

Third, I don't believe in recursion as the basis of all programming. This is a fundamental belief of certain computer scientists, especially those who love Scheme and like to teach programming by starting with a "cons" cell and recursion. But to me, seeing recursion as the basis of everything else is just a nice theoretical approach to fundamental mathematics (turtles all the way down), not a day-to-day tool.
1) Никто не говорил, что «recursion as the basis of all programming», это он сам себе придумал. И употребление слова «верить» вместо «думать», как бы намекает.
2) Ну да, в языке без TCO рекурсия не может быть «day-to-day tool», а в тех, что есть — вполне. Причём от неё точно также можно абстрагироваться всякими filter/map/reduce как for/while/do позволяют абстрагироваться от goto.

Кликните здесь для просмотра всего текста
For practical purposes, Python-style lists (which are flexible arrays, not linked lists), and sequences in general, are much more useful to start exploring the wonderful world of programming than recursion. They are some of the most important tools for experienced Python programmers, too. Using a linked list to represent a sequence of value is distinctly unpythonic, and in most cases very inefficient. Most of Python's library is written with sequences and iterators as fundamental building blocks (and dictionaries, of course), not linked lists, so you'd be locking yourself out of a lot of pre-defined functionality by not using lists or sequences.
— ну понятно, Питон — это религия


Last, let's look at how we could implement tail recursion elimination. The first observation is that you can't do it at compile time. I've seen at least one blog entry that used a bytecode hack to replace a CALL opcode immediately before a RETURN opcode with a jump to the top of the function body. This may be a nice demo, but unfortunately Python's compiler cannot reliably determine whether any particular call is actually reference the current function, even if it appears to have the same name.
— вывод очевиден: Питон просто-напросто говноязычёк, в котором нормальную TCO просто не сделать.

Анонимус дело говорит:
Anonymous said...

How very pythonic of you to make up stupid reasons for not implementing a very simple optimization.

This is very pythonic because it shows poor decision making, poor performance and immature ideology.
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
09.04.2020, 13:52  [ТС]
Цитата Сообщение от helter Посмотреть сообщение
Это не язык, это реализация Common Lisp.
Вот и предлагаю посмотреть, как хвостовая рекурсия в ней http://www.sbcl.org/platform-table.html реализована. А для удобства запустить через LispIDE Ищу IDE для Scheme
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
09.04.2020, 14:07
А зачем? TCO - одна из возможных оптимизаций. SBCL делает её, если выставлены определённые флаги оптимизации. Но, как говорит Гвидо, "нафига?" Зачем я буду опираться на не предусмотренное стандартом поведение без какой-либо причины? Чтобы продемонстрировать, что читал учебник по Scheme? Ср. https://google.github.io/style... #Recursion

К тому же сомневаюсь, что какая-либо реализация оптимизирует взаимную хвостовую рекурсию.
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
09.04.2020, 16:21  [ТС]
https://edu.donstu.ru/scan/%D0... %D0%B5.pdf

Добавлено через 1 час 49 минут
Пытаюсь набрать код со страницы 9 файла. Не хватало скобки. Добавил.
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
41
42
43
44
45
46
47
48
This is SBCL 1.4.14, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.
 
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
 
WARNING: the Windows port is fragile, particularly for multithreaded
code.  Unfortunately, the development team currently lacks the time
and resources this platform demands.
* (set 'a '(bcd))
(BCD)
* a
(BCD)
* (set (car a) (cdr (o f g)))
; in: SET (CAR A)
;     (O F G)
; 
; caught WARNING:
;   undefined variable: F
; 
; caught WARNING:
;   undefined variable: G
; 
; caught STYLE-WARNING:
;   undefined function: O
; 
; compilation unit finished
;   Undefined function:
;     O
;   Undefined variables:
;     F G
;   caught 2 WARNING conditions
;   caught 1 STYLE-WARNING condition
 
debugger invoked on a UNBOUND-VARIABLE in thread
#<THREAD "main thread" RUNNING {23170329}>:
  The variable F is unbound.
 
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
 
restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.
 
((LAMBDA ()))
   source: (O F G)
0]
Добавлено через 7 минут
Использую не последнюю версию SBCL, потому что XP 32 bits.
1
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
09.04.2020, 16:35
Выкиньте эту методичку тоже на помойку. Даже не задавайте вопросов, просто выкиньте.
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
09.04.2020, 17:45  [ТС]
А что такое Элективный курс?

Общая редакция серии «Информатика»: С.Л.Островский
Островский С. Л. Функциональное программирование на языке Лисп : Элективный курс / Сергей Львович Островский. – М. : Чистые пруды, 2009. – 32 с. – (Библиотечка «Первого сентября», серия «Информатика». Вып. 27).
Знакомство с основами языка Лисп наилучшим образом способствует развитию навыков конструирования рекурсивных алгоритмов и пониманию сути рекурсии. В брошюре рассмотрены основы языка и содержится большое количество задач по темам «Обработка списков», «Вычислительные задачи», «Множества», «Комбинаторные алгоритмы».
https://lib.1sept.ru/view_article.php?ID=200901310 (самого курса по ссылке нету).
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,680
Записей в блоге: 14
09.04.2020, 17:48
Цитата Сообщение от supmener Посмотреть сообщение
Элективный
- необязательный, курс по выбору
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
09.04.2020, 18:27
supmener, я не пойму, тебе нужна книга по лиспу на русском? Возьми эту, например.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
09.04.2020, 18:50  [ТС]
Е.И. Большакова, Н.В. Груздева Основы программирования на языке Лисп 2010
http://www.recyclebin.ru/BMK/LISP/PosobieLisp.pdf
Предисловие
Язык Лисп – один из старейших языков программирования и первый
функциональный язык, получивший широкое распространение. Ядро языка
было создано в 60-х годах прошлого века известным ученым
Дж. Маккарти для решения задач обработки символьной информации
[1, 2]. Основная структура данных языка Лисп – список, отсюда и название
языка: Lisp – List Processing.
Пик популярности Лиспа пришёлся на 70-е и 80-е годы, когда он
применялся как основной язык для научных исследований в области
искусственного интеллекта. В эти годы было разработано несколько
достаточно развитых диалектов языка, из которых наиболее известны
InterLisp, MacLisp, Common Lisp. Одна из первых реализаций Лиспа в
России была осуществлена для ЭВМ БЭСМ-6 [8]. На базе концепций
Лиспа был создан ряд других функциональных языков, в частности – язык
Planner [10] для задач искусственного интеллекта и язык Scheme [3].
Хотя язык Лисп существует и развивается давно, тем не менее, он не
был стандартизован, и его диалекты различаются по ряду аспектов.
Официальный стандарт разработан только для языка Common Lisp
[4, 5, 16], возникшего в результате попытки объединить в одном языке
средства нескольких диалектов Лиспа, а также языка Scheme. В настоящее
время кроме нескольких реализаций языка Common Lisp используется
диалект AutoLisp [12] известного пакета AutoCAD, а также достаточно
старый, но удачный диалект MuLisp, частично описанный в [13].
Несмотря на то, что Лисп потерял главенствующую роль как язык
программирования задач искусственного интеллекта, в силу ряда своих
качеств он остается языком, удобным для изучения функционального
программирования. Лисп – один из наиболее ярких представителей
функциональной парадигмы программирования [14, 15]. Простота и
ясность синтаксиса сочетаются в нём с мощностью языковых средств и
естественностью его расширения. Одна из наиболее удивительных
особенностей Лиспа – это единая синтаксическая форма записи программ
и данных, что позволяет обрабатывать структуры данных как программы и
модифицировать программы как данные.
В основу данного учебного пособия легли лекции по
функциональному программированию на базе языка Лисп, неоднократно
читавшиеся Е.И. Большаковой на факультете ВМК МГУ им. Ломоносова.
Основное внимание в пособии уделяется базовым функциональным
средствам языка Лисп, позволяющим изучить основополагающие
принципы функциональной парадигмы. Поскольку непременной
составляющей функционального программирования является
использование рекурсии, в учебном пособии подробно разбираются
приёмы построения рекурсивных программ, иллюстрируемые многочисленными
примерами. Рассматриваются также вопросы
построения функционалов – функций, аргументами и значением которых
являются функции.
Учебное пособие не ставит своей целью описание какого-то
конкретного диалекта языка Лисп, однако в нём освещается ряд важных
особенностей двух его известных диалектов – Common Lisp и MuLisp, в
случае их принципиальных отличий. Существующие в современных
диалектах Лиспа конструкции, нарушающие принципы строгой
функциональности и внесённые в язык под давлением императивной
парадигмы программирования (присваивания, блоки и др.), описываются
лишь для полноты картины языка и сравнительно кратко.
В последнем разделе пособия приводятся задания практикума по
программированию на языке Лисп, поддерживающие его изучение.
Авторы благодарят Н.В. Баеву за помощь в подготовке пособия.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
10.04.2020, 15:21  [ТС]
Шалимов П.Ю. "Функциональное программирование" БГТУ (2003)

Шалимов П.Ю. "Функциональное Программирование на языках Lisp и Erlang" 2010
Миниатюры
Функциональное программирование на Lispe  
0
Заблокирован
10.04.2020, 15:44
"Lisp и Erlang" 2010
Есть LFE - Lisp flovered Erlang. Это по сути Lisp на Erlang VM.
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
10.04.2020, 22:48  [ТС]
В конце 4 урока
https://www.youtube.com/watch?... 33&index=4
есть код. Не понимаю, как работает выражение (prog2 1 2 3 4 5 (sign 5))

Из конспекта урока, который составлял:
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
41
42
43
44
45
46
47
48
49
Наиболее удобно смотреть, как используется Cont, 
когда он расположен в составе какой нибудь функции. 
Напишем функцию, которая будет возращать +1, если ей на вход передали положительной число. 
-1, если отрицательное. И ноль, если это был ноль.
Это самая простая функция, которая используется для ветвления алгоритмов.
[1]> (defun sign(x)(cond
((> x 0)1)
((< x 0)-1)
(T 0))
)
 
SIGN
[2]> (sign 10)
 
1
[3]> (sign -5)
 
-1
[4]> (sign 0)
 
0
[5]> 
 
------------------------------------
 
progn выполняет операторы по одному
progn возращает результат последнего оператора
prog1 вернет оператор 1
prog2 вернет оператор 2
В жизни обычно нужен результат последнего оператора progn
 
каждое из этих чисел является самостоятельным оператором, 
который заключается в том, что надо получить значение этого числа, 
а значение этого числа равно самому себе. 
 
[1]> (progn
 1 2 3 4 5 6)
 
6
[2]> (prog1 1 2 3 4 5 6)
 
1
[3]> (prog2 1 2 3 4 5 6)
 
2
 
 
(prog2 1 2 3 4 5 (sign 5))
2
0
331 / 199 / 9
Регистрация: 12.05.2015
Сообщений: 334
10.04.2020, 22:57
Цитата Сообщение от supmener Посмотреть сообщение
В конце 4 урока
https://www.youtube.com/watch?... 33&index=4
есть код. Не понимаю, как работает выражение (prog2 1 2 3 4 5 (sign 5))
А так?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2020, 22:57
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru