Приятно наконец-то снова решать упражнения на программирование.
В 1.2.4 все они такие, и их больше, чем в прошлых главах.
Хотя, конечно, они также не дают спуску, решать с наскока больше не выходит.
Сомневаюсь, что за сегодня успею прорешать все, так что код будет в следующий раз.
Уфф, SICP решила побыть учебником математики.
Не то, чтобы я против, но подобные задачки особо не повыкладываешь.
Так что в репозиторий. наверное, буду складывать только то, что можно выразить в коде, остальное же будет в тетради.
Упражнение 1.13 я, пожалуй, пропущу.
Это математическое доказательство, которое у меня не получилось вывети с наскока. А еще не удалось удержаться от соблазна подсмотреть подсказку к нему, где мне в целом стала понятна общая идея.
Так что в этот раз вместо своего репозитория приведу ссылку на найденное мной доказательство: https://sicp-solutions.net/post/sicp-solution-exercise-1-13/
Есть подозрение, что мне необходимо подтянуть мои математические знания.
1.10, упражнение на функцию Аккермана. Пришлось немного забрутфорсить решение :lainsad:.
В целом стало понятно, что с точки зрения математики творит (A 2 n), но вот выразить математическим языком тот факт, что это 2 в степени 2 в степени 2, и так n раз, у меня не получилось. Может, тут есть математики, которые просветят, как подобное записывается?
Все еще на первой главе. В этой ее части показали рекурсию, условные конструкции и реализацию вычисления квадратного корня методом Ньютона.
Опять же, по большей части то, что я уже и так знаю (хотя отличия от Common Lisp уже встречаются, беру их на вооружение), однако же последнее было для меня в новинку.
Ну и под конец насыпали новых упражнений. Одно было снова про разницу аппликативного и нормального порядка вычисления, остальные же раскрывали тему метода Ньютона: требовалось улучшить оценку полученного результата, изменив алгоритм функции проверки, а также реализовать функцию кубического корня. Пока что полет нормальный и познавательный, ликвидирую свои прорехи в образовании.
Мои решения, как обычно, доступны в репозитории: https://git.bloat.cat/lambda-yam/sicp-solutions/src/branch/main/chapter-1
Все еще на первой главе. В этой ее части показали рекурсию, условные конструкции и реализацию вычисления квадратного корня методом Ньютона.
Опять же, по большей части то, что я уже и так знаю (хотя отличия от Common Lisp уже встречаются, беру их на вооружение), однако же последнее было для меня в новинку.
Ну и под конец насыпали новых упражнений. Одно было снова про разницу аппликативного и нормального...
Первые пять упражнений первой главы позади.
В целом пока что преподаются основы, но изучать все равно интересно, поскольку затрагиваются темы, в которые при обычном изучении языка обычно не залезают.
Например, порядок вычисления: аппликативный или нормальный. Разница в том, что аппликативный сначала вычисляет значения аргументов и операторов, и лишь потом -- функцию, передавая в нее полученные значения.
Нормальный же подставляет в функцию аргументы "как есть" до тех пор, пока не останутся самые примитивные операторы, и лишь потом все вычисляет.
Иногда, кстати, эти порядки могут выдавать разные результаты, на такой случай как раз одно из упражнений.
Вот мои решения (как-то не пришла в голову идея давать в комментарии формулировку упражнения, так что интересующимся читателям пока что придется заглядывать в книжку) https://git.bloat.cat/lambda-yam/sicp-solutions/src/branch/main/chapter-1
Первые пять упражнений первой главы позади.
В целом пока что преподаются основы, но изучать все равно интересно, поскольку затрагиваются темы, в которые при обычном изучении языка обычно не залезают.
Например, порядок вычисления: аппликативный или нормальный. Разница в том, что аппликативный сначала вычисляет значения аргументов и операторов, и лишь потом -- функцию, передавая в нее полученные значения.
Ну что, легендарная "Структура и интерпретация компьютерных программ" наконец-то сохранена и начата.
Неожиданно крайне... философское вступление, которое озвучивает то, что привлекло меня в программировании: написание кода есть не что иное, как искусство магии: точно составленные формулы изменяют реальность под нужды человека. Пожалуй, язык для такого настроения выбран крайне подходящий.
Думаю иногда постить сюда свой прогресс освоения, при этом постараюсь описывать его так, чтобы и далеким от лиспа было интересно. Но и код решений практической части буду выкладывать, правда, скорее он будет не в самом посте, а в репозитории, чтобы не засорять ленту.
Ну что, легендарная "Структура и интерпретация компьютерных программ" наконец-то сохранена и начата.
Неожиданно крайне... философское вступление, которое озвучивает то, что привлекло меня в программировании: написание кода есть не что иное, как искусство магии: точно составленные формулы изменяют реальность под нужды человека. Пожалуй, язык для такого настроения выбран крайне подходящий.
Думаю иногда...
Может кто-нибудь посоветовать небольшой и уютный хостинг кода по типу гитхаба / гитлаба? Знаю только Codeberg / sourcehut / gitea.
Думаю обзавестись местом для хранения решений задач SICP, плюс потенциальные проекты на лиспах.
Что же, @taxuswc@mk.phreedom.club все же склонил меня в более "схематичную" (бадум-тсс) сферу лиспов, так что ожидайте контента / щитпоста (как пойдет) на тему моих попыток освоиться.
В любом случае будет крайне полезно, ибо позволит уже для себя сравнить и решить, какой же диалект мне больше по душе.
SICP, правда, обещает быть более хардкорным, чем Practical common lisp, но он по идее гораздо полезнее и познавательнее в общем плане, не зря же его не только лисперы (или схемеры?) проходят.
Сижу и думаю, может, на Схему переехать? Заодно будет повод взяться за великий SICP. Но если так -- то на какую? Там как минимум 3 "диалекта".
@aka_dude@mk.phreedom.club вроде бы у нас тобой была беседа на эту тему. Можешь провести краткий ликбез?
Хотя, конечно, не факт, что после переезда с CL я перестану спотыкаться о мистические ошибки компилятора и рантайма.
Пожалуй, именно сейчас тот момент в моей жизни, когда я больше всего мучаю ChatGPT.
Кажется, только так можно понять, что же не нравится в моем коде компилятору / среде исполнения, ибо иначе информацию по возникающим проблемам и ошибкам краней сложно найти.
Хотя ладно, даже нейросеть редко вывозит, если это не что-то совсем очевидное.
А еще все больше убеждаюсь, что на CL, видимо, стоит писать все же в императивном стиле.
Забавно, похоже, бот @rur@lor.sh пытается автоматически определить язык поста по первым символам.
Интересно, позволяет ли misskey указывать его вручную?
Вроде бы что-то такое было в mastodon.
Выдержка из Practical Common Lisp:
"Finally, the LOOP macro provides a full-blown mini-language for expressing looping constructs in a non-Lispy, English-like (or at least Algol-like) language. Some Lisp hackers love LOOP; others hate it."
Окей, то есть мои комментарии про "язык внутри языка" оказались вполне себе корректными.
Пожалуй, потихоньку начинаю склоняться ко вторым: loop чувствуется неидиоматичным, чем-то другим, чужеродным для языка.
Когда вырасту, попробую все же реализовать псевдорекурсию. Неплохой проектик выйдет.
Выдержка из Practical Common Lisp:
"Finally, the LOOP macro provides a full-blown mini-language for expressing looping constructs in a non-Lispy, English-like (or at least Algol-like) language. Some Lisp hackers love LOOP; others hate it."
Окей, то есть мои комментарии про "язык внутри языка" оказались вполне себе корректными.
Итак, спустя всего лишь день у меня получилось написать собственный string-split на common lisp. Забавно, что по сути это оказалось сложнее, чем задачка на codewars, которой этот функционал требовался.
Кстати, обошлось ровно одним loop, без всяких прочих poop. Его гибкости хватило на ВЕСЬ функционал.
:with присваивает символу значение еще до первой итерации цикла. При этом ставится внутри цикла.
И получается, что символ-итератор на момент присваивания все еще nil, даже если последовательность не пустая.
Сколько времени мне потребовалось, чтобы понять, где ошибка?
Хо-хо...
орущий_суслик.mp4
Мысли на ночь, после того, как мозг немного расплавился от попытки реализовать сплит строки.
Можно ли сказать, что приснившийся мне человек существует? Не в том смысле, что его внешность основана на случайном прохожем, который встретился в трамвае, а в плане того, можно ли допустить, что то, что я вижу, и что способно (в теории) иметь свой характер и свое мнение, пусть это и будет обрабатываться частью моего мозга?
А еще вот что интересно: если допустить, что эту персоналию можно назвать существующей, будет ли с точки зрения религии грехом ее убийство? При условии, что делается это абсолютно сознательно (имеется в виду не то, что человек осознает тот факт, что он во сне, а то, что он принял бы точно такое же решение в "реальности").
Сорян, накрыло немного. Зато хоть какое-то разнообразие, а не только мое нытье про скобки.
Мысли на ночь, после того, как мозг немного расплавился от попытки реализовать сплит строки.
Можно ли сказать, что приснившийся мне человек существует? Не в том смысле, что его внешность основана на случайном прохожем, который встретился в трамвае, а в плане того, можно ли допустить, что то, что я вижу, и что способно (в теории) иметь свой характер и свое мнение, пусть это и будет обрабатываться частью моего мозга?
Можно ли сказать, что приснившийся мне человек существует?
Сказать можно что угодно. Но если и да - он явно существует так-же, как я или ты. А мы, кстати, существуем? Типа, "я мыслю, следовательно, я существую", имхо, немного устарело)
А еще вот что интересно: если допустить, что эту персоналию можно назвать существующей, будет ли с точки зрения религии грехом ее убийство?
Во время решения задачи на codewars:
-- Вроде бы выглядит несложно. Надо только засплиттить строку по двоеточию. Лисп, какая функция у тебя этим занимается?
-- ...
-- У тебя же есть такая функция?...
-- :lainsmile:
Есть подозрение, что большинство задач можно решить с помощью одного макроса loop. А найденные мной шпаргалки отнюдь не полные.
Решаю тут задачки на Codewars, оказалось, что у этого макроса даже собственный let имеется.
Может, у него есть и аналог -> и ->> из Clojure.
Кстати, вроде бы был какой-то способ группировки через точку. Надо посмотреть.