home.social

#scriptfu — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #scriptfu, aggregated by home.social.

fetched live
  1. GIMP Script-Fu ООП. Встраиваем векторы в систему классов Фигур и все Фигуры в язык Функциональной геометрии

    Библиотека функций к Script-fu В предыдущей статье мы рассмотрели имеющиеся в GIMP возможности векторной графики. Здесь мы рассмотрим как эти возможности использовать при построении графических примитивов - Фигур. Для построения абстракций фигур мы уже написали несколько классов: Фигуры рисуемых по контуру Кистью и Карандашом, Фигур заполняемых определённым цветом, Комбинированных Фигур, Фигур использующих Изображения и Фигур использующих Текст. Здесь я продемонстрирую, как легко и непринуждённо мы можем встроить новые абстракции в существующую иерарахию классов. А заодно рассмотрим как вся эта иерархия классов может испольоваться в языке функциональной геометрии, рассмотренном в предыдущем цикле статей.

    habr.com/ru/articles/937886/

    #lisp #scheme #gimp #scriptfu #ооп #векторная_графика

  2. GIMP Script-Fu ООП. Векторы

    Библиотека функций к Script-fu Когда то, очень давно, считалось что графические редакторы делятся на растровые и векторные. К векторным относились Coreldraw Adobe Illustrator Inkscape и работали они не с отдельными пикселами изображений, а с элементами называемыми векторами, которые можно превращать, с помощью манипуляций в дуги различной формы, называемыми кривыми Безье. К растровым же относились Photoshop Paint и тот же GIMP. В этих редакторах отсутствовала какая либо геометрия и изображения представляли собой наборы отдельных точек - пикселов. Но время не стоит на месте и элементы растрового редактирования проникали в редакторы, которые считались векторными и наоборот, элементы векторных редакторов переносились в растровые графические редакторы. Примером тому является GIMP. Представление о том, что GIMP то растровый графический редактор давно уже устарело. Текстовый слой, да и вся работа со шрифтами в GIMPе это работа с векторными объектами представляющими собой кривые Безье. Таким образом целые текстовые слои в GIMP представляют собой векторные объекты. По мимо отдельных текстовых слоёв, в каждом изображении GIMP можно создавать отдельные строки и вектора. Вот с ними мы сегодня и разберёмся.

    habr.com/ru/articles/937152/

    #lisp #scheme #scriptfu #gimp #векторная_графика

  3. GIMP Script-Fu ООП. ООП на миксинах или сказ о том: «Да что оно может ваше множественное наследование?»

    Библиотека функций к Script-fu Вы любите рефакторинг? Ну вот и я приблизительно так же. Основное правило хорошего программиста, такое: "Работает, НЕ ТРОГАЙ!". Но иногда, в редкие минуты помутнения/вдохновения, возникает желание, или я бы даже сказал зуд, в одном месте, и мы садимся за рабочее место, берём в руки клавиатуру и начинаем "творить шедевры" с чистого листа. Системы подпрограмм для языка функциональной геометрии я писал три раза: сначала в функциональном стиле(и в этом то месте и возник пресловутый "свитчинг по типам", потом в стиле примитивных объектов, который не имел наследования, но я придумав хак с шаблонным использованием кода, значительно сократил его дублирование и теперь, когда я разработал развитую ООП систему, во многом повторяющую функциональность CLOS. И это событие прекрасная причина, чтобы переработать старый ООП код, в новой ОО системе. Чем мы с вами здесь и займёмся.

    habr.com/ru/articles/936636/

    #lisp #scheme #gimp #scriptfu #ооп

  4. GIMP Script-Fu ООП. Обобщённые функции и примитивные типы данных

    Библиотека функций к Script-fu Как я ранее уже говорил, обобщённые функции нашей системы производят диспетчеризацию вызовов методов основываясь на типах входящих аргументов. Пока меня устраивала ситуация, что диспетчеризация производится только для классов. Все остальные типы данных не учитывались при диспетчеризации методов. В реально же CLOS возможна диспетчеризация по примитивным типам данных. И вообще для работы обобщённых функций классы не требуются. Можно ли как то реализовать подобное поведение в нашей системе? Решению данного вопроса и посвящена эта статья.

    habr.com/ru/articles/936210/

    #lisp #scheme #gimp #scriptfu #типизация #ооп

  5. GIMP Script-Fu ООП. Небольшой рефакторинг объектной системы. Изюминка всего проекта

    Библиотека функций к Script-fu В принципе реализация представленная в файле obj4.scm и описанная ранее, меня вполне устраивала. Я реализовал там всё что хотел от объектной системы: определения классов и обобщённых функций, множественное наследование, статические поля класса. Но вот какое-то маленькое зёрнышко сомнения, мешало мене оставить этот проект. А всё ли я сделал для ускорения работы системы? И дело даже не в том, что какие то нехорошие люди из проекта GIMPа обрезали возможность для Script-fu загружать расширения, что не даёт возможности быстро рассчитать хеш-код символов(а то и вовсе заменить хеш-таблицы сишной реализацией). Нет. Для себя я спокойно перекомпилирую Script-fu и буду пользоваться всеми преимуществами предоставляемыми настоящей tinyscheme. Но что же можно сделать ещё, чтобы улучшить скорость работы ОО системы? А может и не только скорость.

    habr.com/ru/articles/935292/

    #gimp #lisp #scheme #scriptfu #ооп

  6. GIMP Script-Fu ООП. Dot синтаксис и другой синтаксический сахар

    Библиотека функций к Script-fu После написания объектной системы для Script-fu я задумался над примерами, на которых хорошо бы было проверить эту систему. Я прошерстил уйму литературы, но хороших примеров использующих все возможности ООП в литературе встречается крайне мало. Ну что толку реализовывать класс List в Лиспе? А класс Stack? Примерами подобных классов пестрят книжки по Си++. Всё было не интересно, но вот я встретил книжку "Теория вычислений для программистов" Тома Стюарта, и вот примеры из неё, написанные на Ruby, показались мне интересными. Да в Ruby нет множественного наследования, но есть возможность создавать миксины, что несколько сглаживает этот недостаток. И вот делая примеры из этой, безусловно замечательной(с точки зрения теории вычислений), книжки я заметил, что мой код получается более длинный чем код Ruby. И это происходит не только из за наличия операторов в Руби. Сами определения классов и методов в Руби получаются компактнее, и требуют меньше кода. Сможем ли мы что нибудь сделать, чтобы "догнать" Руби в "краткости" кода?!

    habr.com/ru/articles/934894/

    #lisp #scheme #gimp #scriptfu #ооп

  7. GIMP Script-Fu ООП. Статические поля класса

    Библиотека функций к Script-fu Итак, мы разработали практически полнофункциональную ООП систему для языка tinyscheme, так же работающую в script-fu GIMP. Но гложет меня одна мысль, реализовать поля общие для всех объектов класса. В разных языках они называются по разному, но смысл один, некие значения которые общие для всех объектов одного класса. В принципе как я уже указывал, такие поля реализуются как глобальные переменные, но реализация их в виде подсистемы ООП облегчит управление этими полями и использование их в обобщённых функциях. Тут есть тонкий момент: обобщённая функция может работать не только с объявленными типами параметров, но и с их наследниками. Если мы используем общие поля для класса в виде какой то глобальной переменной, то с этими полями могут работать не только объекты объявленных в параметрах классов, но и их потомки. И по идее методы обобщённой функции должны работать с типами соответствующим типам входных аргументов, а не просто типам объявленных параметров. А работа с глобальной переменной не будет различать одних потомков объявленных параметров метода от других. Во всяком случае такая персонализация работы будет затруднена и должна будет выполняться в ручную.

    habr.com/ru/articles/934560/

    #lisp #scheme #gimp #scriptfu #ооп

  8. GIMP Script-Fu ООП. Тестирование на «РОМБЕ СМЕРТИ»

    Библиотека функций к Script-fu Написание кода на Лисп это тестирование, я не знаю(это не значит что их нет, просто я их действительно не знаю) ни одного языка программирования в котором цикл: написание код - проверка(тестирование) был бы таким коротким. Кстати в Script-fu я работаю через буфер обмена, это не удобно! Там есть возможность работать из Емакс, через сервер Scrip-fu, но я эту возможность не использую(приятно видеть консоль), а с обычной схемой или лиспом, работа в передаче кода заключается в нажатии пары клавиш. Лисперы не пишут многостраничные листинги кода, а затем его тестируют, они пишут функцию, выполняют его в интерпретаторе и сразу тестируют. Всё это благодаря наличию в системе REPL. И всё таки не смотря на это настаёт момент, когда требуются отдельные тесты, которые удобно запустить и проверить консистентное состояние программной системы, а то в процессе такого интенсивного создания-тестирования программы всё равно можно что либо опустить, и какая нибудь функциональность да отвалится. В нашем случае(в связи со сложностью функционирования комбинаций методов) потребуются тесты проверяющие корректность функционирования обобщённых функций в объектной системе и, по мимо них, правильность обращения к полям объекта, т. е. правильность создания самих объектов и т.д. Так что эти тесты будут скорее интеграционными, чем юнит-тестами.

    habr.com/ru/articles/934092/

    #lisp #gimp #scriptfu #ооп #тестирование

  9. GIMP Script-Fu ООП. Основной дизайн (аля CLOS)

    Библиотека функций к Script-fu Итак, теперь наша система позволяет описывать классы с иерархиями множественного наследования и описывать обобщённые функции(generic function) и они придают динамику, придают жизнь создаваемым в системе объектам. Но так ли хороши описанные нами обобщённые функции? Да с точки зрения широко распространённых("классических") ООП систем, они полностью повторяют функциональность методов объектов. При вызове обобщённой функции, происходит диспетчеризация вызова и выбирается наиболее подходящий по типам аргументов метод обобщённой функции. НО в CLOS это НЕ ТАК!!! Да в простейшем случае это так, НО..! CLOS предоставляет более гибкий способ организации кода, когда выполняемый при вызове обобщённой функции код представляет собой не один метод, а целую группу методов. Причём создаётся эта группа динамически в момент вызова, в зависимости от текущих аргументов обобщённой функции(вернее их типов/классов). А в основе такой организации кода лежит спецификация методов обобщённой функции различными квалификаторами .

    habr.com/ru/articles/933644/

    #gimp #scriptfu #lisp #ооп

  10. GIMP Script-Fu ООП. Обобщённые функции

    Библиотека функций к Script-fu Готовя эту статью я интересовался, что там в других языках, что там за "дженерики"? Все языки разбирать не буду, но скажу одно: Generic function использующиеся в ЛИСПе и современые дженерики различаются как НЕБО и ЗЕМЛЯ. За дженерики в современных языках в основном ратуют строго типизированные языки, всем понятно, что писать кучу однотипного кода просто глупо. Не скажу точно, кто стоит у истоков современных "дженериков", но пожалуй одним из ранних их проявлений это ШАБЛОНЫ в С++. Почему все остальные языки типа явы и ей подобных, решили назвать свои шаблоны дженериками мне не понятно. (у меня есть язвительное замечание, что хотели как в лиспе, но получилось как всегда). Но дело в том что в ПОДОБНЫХ дженериках языки с динамической типизацией просто не нуждаются. Функция list работает с любыми типами данных, ШАБЛОНЫ не нужны! А в С++ именно контейнеры стали основной побудительной силой использования дженериков, это просто хранилища которые хранят значения, если Си мы можем обойтись (void *) и потом привести тип к нужному, то С++ решил пойти по типобезопасному пути, ну немного "потолстев" в коде. Ну а что же там у современных его последователей? Рассмотрим Go. Пытаясь избавиться от типа, вводят обобщённую переменную T, но понимая, что сделать то с ней ничего нельзя(кроме как хранить и выдать обратно), пытаются как то её ТИПИЗИРОВАТЬ!!! Вводят КОНТРАКТ! А что делать когда в функции надо будет делать сложение? Надо будет к этому контракту добавить ещё контракт аддитиве? а умножение? или ещё что то? в любом случае код функции БЕДЕН! именно в силу того что мы не знаем что может прилететь нам в типе Т. Я вам расскжу что такое НАСТОЯЩИЕ ДЖЕНЕРИКИ.

    habr.com/ru/articles/933466/

    #ооп #generics #generic #lisp #scheme #gimp #scriptfu

  11. GIMP Script-Fu ООП. Основной алгоритм в ООП системах с множественным наследованием

    Библиотека функций к Script-fu Введение. Прежде чем приступить к описанию реализации обобщённых функций, надо рассказать о основном алгоритме использующемся при выборе наиболее подходящего метода, при вызове обобщённой функции. Наша система реализует множественное наследование, поэтому при вызове обобщённой функции надо реализовать какой то способ определяющий какой метод надо построить иерархию родителей, от которых наследуются классы объектов используемых в качестве аргументов обобщённой функции и на основе этих иерархий выбрать метод наилучшим образом подходящий для данного набора аргументов.

    habr.com/ru/articles/933308/

    #lisp #gimp #scriptfu #ооп #множественное_наследование

  12. GIMP Script-Fu ООП. Классы. Начало

    С необходимостью введения в язык Script-fu Объектно-ориентированного стиля программирования я столкнулся на поздних этапах реализации языка функциональной геометрии. Когда в коде появились "свичи/переключатели" и возможность исполнения кода в зависимости от типа входящих данных. Сам то этот "переключатель" написать не сложно, но в развивающемся проекте, постоянно возникают новые типы, изменяются, от каких то приходится отказываться, а ещё есть вариант создания модульных систем, когда в одном варианте существует один набор типов, а вдругом другой, ну а в третьем третий и т.д. И код этого "переключателя" постоянно приходится переписывать, или прибегать к различным "хакам", модифицирующим код в зависимости от того или иного варианта загрузки. Когда вы в своём проекте сталкиваетесь с подобными конструкциями это явный признак того что вам необходимы языковые конструкции поддерживающие гибкое поведение кода. В объектно-ориентированном программировании подобное поведение функций называется полиморфным, а сам принцип позволяющий создавать такие функции полиморфизмом.

    habr.com/ru/articles/933022/

    #lisp #scheme #scriptfu #gimp #ооп_программирование #ооп

  13. GIMP Script-Fu Первый Дан. Язык функциональной геометрии. Итоги

    Библиотека функций к Script-fu Язык функциональной геометрии В предыдущей части мы рассмотрели базовые операции языка функциональной геометрии, так сказать кирпичики языка. Сегодня мы ознакомимся с более сложными функциями, т.е покажем что из этих кирпичиков можно построить. Базовым изображением для работы, будет "рыба" Питера Хендерсона.

    habr.com/ru/articles/889620/

    #gimp #scriptfu #lisp #scheme

  14. GIMP Script-Fu Первый Дан. Язык функциональной геометрии. Рисунки(картинки) и базовые операции

    Библиотека функций к Script-fu Язык функциональной геометрии Базовым элементом языка функциональной геометрии являются рисунки (picture), это функции которые отображают своё содержимое в предоставляемые им в виде аргументов изображение и рамку. Конечно в базовой документации об изображениях нет речи, но здесь я адаптировал этот язык в реалиям GIMP и включил изображение на котором будет отображаться картинка как часть интерфейса вызова функции. Хотя можно было и выкинуть их из него, создав какой нибудь глобальный контекст, хранящий текущее изображение с которым работает язык, к которому бы обращались все функции, это дело вкуса. Рисунки мы можем создавать из фигур и изображений, задавая при этом ограничения, границы картинки отображаемые в задаваемую рамку.

    habr.com/ru/articles/887478/

    #lisp #gimp #scheme #scriptfu

  15. GIMP Script-Fu Первый Дан. Выходим за Рамки

    Библиотека функций к Script-fu Создав функции отображения фигур(fig, figs) и изображений(img) в заданные рамки(rect), мы практически подошли к созданию языка функциональной геометрии. Но базовые возможности языка созданного на лекциях SICP, немного отличаются от языка Эшера Хендерсона. Дело в том что на лекциях SICP в целях облегчения усвоения материала, лектор упростил возможности отображения изображений в рамку. На лекциях осуществлялось точное отображение, из полных габаритов рисунка в полные габариты рамки. Но язык Эшера Хендерсона предусматривает расширенное отображение исходного изображения в предоставленную рамку, т.е. в саму ограничивающую рамку может отображаться только специально выделяемая часть изображения, остальная же часть изображения может размещаться ВНЕ пределов рамки.

    habr.com/ru/articles/884258/

    #lisp #gimp #scriptfu #scheme

  16. GIMP Script-Fu Первый Дан. Фигуры. Объектный подход

    Библиотека функций к Script-fu Реализовав простейшую объектную систему в Scheme полезно было бы продемонстрировать преимущество от её использования. Чем в этой статье мы и займёмся. Демонстрацию проведём на примере абстракции Фигуры , ведь именно при реализации этой абстракции у меня и возникло сожаление об отсутствии ОО средств в Scheme.

    habr.com/ru/articles/878808/

    #lisp #scheme #gimp #scriptfu

  17. GIMP Script-Fu Первый Дан. Объектно-ориентрованное программирование в Scheme. Простая реализация

    На протяжении всей работы по реализации языка функциональной геометрии Эшера Хендерсона мы немного развивали tinyscheme , различными языковыми конструкциями и ни разу у меня не возникало необходимости использовать Объектно-Ориентированный подход, но вот реализовав абстракцию Фигуры, я понял, что языку tinyscheme очень не хватает объектов и полиморфных функций, потому что данная конструкция не позволяет развивать абстракцию фигуры, расширять различные их варианты. Нет расширять и изменять конечно можно, но придётся постоянно её дописывать и изменять. С этим нужно было что-то делать. И в этой статье речь пойдёт о первой попытке решить проблему отсутствия нормального ООП в tinyscheme.

    habr.com/ru/articles/878018/

    #lisp #scheme #gimp #scriptfu

  18. GIMP Script-Fu Первый Дан. Фигуры

    Библиотека функций к Script-fu Мы уже использовали контуры, для вычерчивания кривых линий, для формирования выделений, для закрашивания областей изображения. Но абстракция контура охватывает только позиции(точки), которые можно использовать по своему усмотрению. Пора бы создать абстракцию которая бы объединила возможность рисования контура, кисть, цвет, и тип получаемого изображения, будь это фигура или голый контур. Руководствуясь этими соображениями я объединил в структуре фигуры и окружил её набором функций, создающих абстракцию фигуры.

    habr.com/ru/articles/875962/

    #gimp #scheme #lisp #scriptfu

  19. GIMP Script-Fu Первый Дан. Рамки

    Библиотека функций к Script-fu Для отрисовки некоторого изображения в произвольном месте холста изображения это место надо как то определить. Определим рамку в которой мы будем отображать наши контуры или изображения как три вектора, вектор начала координат, вектор обозначающий горизонтальное направление(ось X), вектор обозначающий вертикальное направление(ось Y).

    habr.com/ru/articles/867936/

    #gimp #lisp #scheme #scriptfu

  20. GIMP Script-Fu Первый Дан. Берём Кисти и рисуем Точки и Звёздочки

    Да да, опять точки. Я ранее уже рассказывал как построить абстракцию точки. А теперь мы займёмся рисованием точек, выбранными кистями, рассмотрим различие в управлении кистями версий 2.10 и 2.6, ознакомимся с понятием "динамика кисти" и как с ней работать, а так же займёмся рисованием звёзд без градиента и с помощью "псевдо градиента". Поехали. Библиотека функций к Script-fu

    habr.com/ru/articles/865174/

    #lisp #scheme #scriptfu #gimp

  21. GIMP Script-Fu Первый Дан. Удобная передача параметров в функцию

    Библиотека функций к Script-fu Script-fu(Тинисхема) передает параметры в функцию в виде списка и позволяет передавать значения в обязательные именованные параметры, функции с одним параметром принимающим неограниченное количество значений , или функции смешанного типа, с обязательными именованными параметрами и параметром остатком в виде списка. Но иногда... мы хотим чего-то БОЛЬШЕГО!!!

    habr.com/ru/articles/863430/

    #lisp #scheme #scriptfu #macros #gimp

  22. GIMP Script-Fu Первый Дан. Линейные преобразования на плоскости

    Библиотека функций к Script-fu Итак, настоящая киллер функция по отображению изображений это gimp-item-transform-matrix . Именно на её основе мы и будем строить все отображения изображений в нашем проекте. Для использования функции GIMP gimp-item-transform-matrix , осуществляющей линейное преобразования заданного отображаемого объекта, нам нужна структура в которой мы могли бы хранить матрицу преобразования. На основе этой структуры, мы построим абстракцию линейного двумерного преобразования на плоскости. Я посмотрел все эти преобразования и увидел, что матрица имеет всего 6 значимых полей, остальные два ноль и одно единица, поэтому наша структура будет хранить всего 6 полей.

    habr.com/ru/articles/861000/

    #lisp #scheme #scriptfu #gimp

  23. GIMP Script-Fu Первый Дан. Реализация Хеш-Таблицы

    Библиотека функций к Script-fu Любой современный язык поддерживает множество структур данных, позволяющих программисту эффективно разрабатывать свои программы. В принципе для большинства задач решаемых прикладным программистом достаточно трёх основных структур: список , структура которая может расти неограниченно, но имеющая малую скорость доступа к произвольному элементу, массив (или вектор), структура имеющая быстрый доступ к произвольному элементу, но ограниченная, выбранным заранее размером и хеш-таблица , совмещающая достоинства обоих этих структур, доступ к произвольному элементу, за константное время(чуть большее чем у массива) и имеющая возможность расти неограниченно. Тинисхема имеет в своём наборе возможных структур данных и списки, и массивы, но вот реализации хеш-таблиц для неё нет. В этой статье мы попытаемся исправить этот недостаток, снабдив прикладного программиста ещё одной мощной структурой данных. С чего начать разработку хеш-таблиц? Конечно же с функций создающих хеш-код для примитивных типов данных, которые мы планируем использовать в качестве ключей.

    habr.com/ru/articles/860576/

    #lisp #scheme #scriptfu #gimp #hash_table #hash #hash_function

  24. GIMP Script-Fu Первый Дан. Наивные графические преобразования

    Напомню нашу цель, это создание языка функциональной геометрии . Одно из базовых операций в нём является отрисовка некоторого изображения в заданный прямоугольник, вернее даже не прямоугольник, а рамку, которая может представлять из себя параллелограмм, повёрнутый на произвольный угол относительно горизонтальной оси координат, расположенный в любой точке плоскости рисования. Пока мы и близко не приблизились к этой цели. Продолжим исследование возможностей GIMPа по отображению изображений. Библиотека функций к Script-fu

    habr.com/ru/articles/860458/

    #lisp #scheme #scriptfu #gimp

  25. GIMP Script-Fu Первый Дан. Ускоряем Script-fu

    Библиотека функций к Script-fu Как я уже говорил тинисхема ленива, ленива настолько, что когда ей дают на вход определение функции, она тупо его считывает, и говорит: "А..., потом обработаю". И все макросы, которые находятся которые находятся в коде функций остаются не раскрытыми. В этой статье мы рассмотрим вопрос, что с этим делать.

    habr.com/ru/articles/859984/

    #lisp #scheme #scriptfu #gimp

  26. GIMP Script-Fu Первый Дан. Сортировка

    Кто бы мог представить, что в современном мире ещё можно встретить языки программирования, в которых нет сортировки как штатной функции языка? Как себе можно вообще представить программирование без этой функции?! Ну что ж знакомьтесь, это язык tinyscheme и его GIMP порт под названием Script-fu.

    habr.com/ru/articles/858922/

    #lisp #scheme #scriptfu #gimp

  27. GIMP Script-Fu Первый Дан. Точки, Контуры, Кисти и Градиенты

    Создать абстракцию неких объектов на лиспе, это значит создать некий функциональный интерфейс обрабатывающий объекты данного типа. Нам необходима абстракция точки в двумерном пространстве, значит надо хранить две координаты. Для хранения двух значений в лиспе идеально подходит структура пары, создаваемая cons , на ней и будет базироваться первый вариант реализации точки.

    habr.com/ru/articles/858646/

    #lisp #scheme #scriptfu #gimp

  28. GIMP Script-Fu Первый Дан. Погружение в программирование графики

    Первым делом в окне script-fu я научился определять процедуры и запускать их: (define (square x) (* x x)) (square 5) А потом понеслось ..... Простые примеры работы с изображениями, слоями, выделениями в GIMP. Примеры рисования линий и окружностей.

    habr.com/ru/articles/857918/

    #lisp #scheme #scriptfu #gimp

  29. GIMP Script-Fu Первый Дан. Расширения к Script-fu

    Если сравнить расширяемое приложение с коробочкой, то плагины, это полезные вещи, которыми можно наполнить эту коробочку, придающие новое содержание нашему приложению. В этом ряду стоит и такая вещь как Script‑fu. Но что если я скажу, что Script‑fu так же может быть такой же «коробочкой» и может иметь расширения, давайте разбираться. Но сразу скажу, счастливы будут не все.

    habr.com/ru/articles/856718/

    #lisp #schema #gimp #scriptfu #си

  30. GIMP Script-Fu Первый Дан. Макросы. Первое знакомство

    Программисты: Разработчик, твой язык жалок, синтаксис беден и убог, как нам писать код?!? Разработчик(языка lisp): Вот вам МАКРОС !!! Разработчики языка Лисп(и Scheme тоже) были очень хитрые ребята, бессовестно воспользовавшись гомоиконичностью языка(т.е свойством подобия кода данным - знаменитая фраза в лиспе всё список, относится именно к этому свойству) они внедрили в язык макросы, средства синтаксической абстракции. Таким образом в отличии от большинства ныне распространённых языков программирования(разработчики которых ночами не спят, пишут синтаксические анализаторы для всё новых и новых синтаксических форм своих языков), разработчики лиспов, обходятся минимальным набором синтаксических форм, что упрощает и ускоряет процесс интерпретации(да и компиляции тоже), а всё остальное богатство синтаксиса, передано на откуп макросам. Именно через макросы, являющиеся ортогональным средством абстрагирования, по отношению к функциональной абстракции, доступной во всех языках программирования, реализуется совершенствование и развития языков лисп. Это можно описать математической аналогией, когда в математике произошёл переход от рациональных чисел(в языке доступна только функциональная абстракция) к комплексным(в язык внедряется система синтаксической абстракции - макрос).

    habr.com/ru/articles/856246/

    #lisp #scheme #scriptfu #gimp