
Да. Спустя наверно 3 дня я решил сделать это. Долго конечно, но что тут поделаешь.
Также если нужно, можете посмотреть на первую статью об этом лиспе.
Старейший высокоуровневый язык программирования
Да. Спустя наверно 3 дня я решил сделать это. Долго конечно, но что тут поделаешь.
Также если нужно, можете посмотреть на первую статью об этом лиспе.
Кликбейтные заголовки, давайте признаемся, надоели всем. Сейчас они встречаются даже на Хабре. Программист Линус Ли, судя по всему, испытывал те же чувства и решил действовать по принципу «не можешь победить — доведи до крайности». В результате он создал Tabloid — полноценный язык программирования, где весь код пишется в стиле сенсационных заголовков.
Представьте язык, где вместо привычного function hello() вы пишете DISCOVER HOW TO HELLO WITH (англ. «узнайте, как сделать... с помощью»), а вместо return используете SHOCKING DEVELOPMENT! (англ. «шокирующее развитие событий»). А еще каждый листинг должен заканчиваться фразой PLEASE LIKE AND SUBSCRIBE.
Звучит как странная шутка? Да, но этот язык реально работает, имеет собственный интерпретатор и позволяет писать полноценные программы.
Всем привет! Сегодня мы с вами сделаем реализацию LISP'а. Конечно же не полного.
Возможно, когда то я доведу этот лисп до ума и напишу новую статью... Но не обещаю.
В этом монументальном тексте я постараюсь рассказать вам о трёх непревзойдённых шедеврах XX века - математическом языке лямбда-исчисления, языке программирования LISP и спроектированном языке человеческого общения под названием "Ложбан", а также о лежащих в их основе общих принципах и идеях. Кроме того, в конце этого поста я представлю вам свой собственный проект по конструированию языка человеческого общения, в основу которого я положил фундаментальные лингвистические симметрии. Мой проект развивает идеи Ложбана и пытается исправить его недостатки, в мессианской надежде отыскать давно утерянный допотопный язык.
В первой части статьи мы рассмотрели общую семантику применения функции в различных языках программирования и реализацию императивного вызова функции в машинном коде в стековом и бесстековом вариантах. Теперь мы рассмотрим теорию и практику реализации императивного вызова функции в модели продолжений (continuations): что такое продолжения, зачем нужны явные и неявные продолжения, как при помощи продолжений реализовать различные используемые в языках программирования управляющие конструкции.
Для многих людей, занимающихся программированием, вызов функции воспринимается практически как синоним передачи управления с сохранением адреса возврата и выделением фрейма памяти в стеке. Это однако, не всегда верно и в практическом, и в теоретическом отношении. О семантике и прагматике вызова функций мы и поговорим в этой статье.
Я астрофизик, занимаюсь исследованием астрофизических течений в окрестностях двойных звезд и экзопланет. Тема очень обширная и интересная, но сегодня статья будет немного не об этом, и даже не о том, как, собственно, это делается, а об одной маленькой, как мне казалось, проблеме, которая погрузила меня в пучины программирования, хотя изначально цель моя была от программирования избавиться, по возможности, совсем. А именно - о символьной математике и об упрощении алгебраических выражений.
Библиотека функций к Script-fu
Язык функциональной геометрии
В предыдущей части мы рассмотрели базовые операции языка функциональной геометрии, так сказать кирпичики языка. Сегодня мы ознакомимся с более сложными функциями, т.е покажем что из этих кирпичиков можно построить. Базовым изображением для работы, будет "рыба" Питера Хендерсона.
Библиотека функций к Script-fu
Язык функциональной геометрии
Базовым элементом языка функциональной геометрии являются рисунки (picture), это функции которые отображают своё содержимое в предоставляемые им в виде аргументов изображение и рамку. Конечно в базовой документации об изображениях нет речи, но здесь я адаптировал этот язык в реалиям GIMP и включил изображение на котором будет отображаться картинка как часть интерфейса вызова функции. Хотя можно было и выкинуть их из него, создав какой нибудь глобальный контекст, хранящий текущее изображение с которым работает язык, к которому бы обращались все функции, это дело вкуса.
Рисунки мы можем создавать из фигур и изображений, задавая при этом ограничения, границы картинки отображаемые в задаваемую рамку.
Статья продолжает рассмотрение неочевидных возможностей Gambit Scheme, начатое в предыдущих статьях.
На этот раз расскажем о том, как использовать в программах на Gambit Scheme код на языке Python, в том числе многочисленные библиотеки, разработанные для Python.
Библиотека функций к Script-fu
Создав функции отображения фигур(fig, figs) и изображений(img) в заданные рамки(rect), мы практически подошли к созданию языка функциональной геометрии. Но базовые возможности языка созданного на лекциях SICP, немного отличаются от языка Питера Хендерсона. Дело в том что на лекциях SICP в целях облегчения усвоения материала, лектор упростил возможности отображения изображений в рамку. На лекциях осуществлялось точное отображение, из полных габаритов рисунка в полные габариты рамки. Но язык Питера Хендерсона предусматривает расширенное отображение исходного изображения в предоставленную рамку, т.е. в саму ограничивающую рамку может отображаться только специально выделяемая часть изображения, остальная же часть изображения может размещаться ВНЕ пределов рамки.
Продолжим рассмотрение неочевидных поучительных возможностей программирования на Gambit Scheme, начатое в предыдущих статьях.
На этот раз займёмся пристойной печатью значений типа u8vector, то есть массивов байтов.
Значения такого типа используются в Gambit Scheme везде, где нам нужно работать с представлением памяти компьютера на нижнем уровне. В частности, такими значениями представляются неформатированные пакеты UDP, отправляемые и получаемые по сети.
Библиотека функций к Script-fu
Реализовав простейшую объектную систему в Scheme полезно было бы продемонстрировать преимущество от её использования. Чем в этой статье мы и займёмся. Демонстрацию проведём на примере абстракции Фигуры, ведь именно при реализации этой абстракции у меня и возникло сожаление об отсутствии ОО средств в Scheme.
Попробуем написать разными способами программу, реализующую циклическое вычисление, заключающееся в печати последовательных чисел от n1 до n2. Предметом нашего внимания будет способ завершения цикла. Поскольку для иллюстрации мы будем использовать язык Scheme, как один из наиболее концептуальных в области теории вычислений, то для реализации цикла используем рекурсию, как единственный циклический механизм в этом языке. Впрочем, для большинства наших способов мы будем указывать на аналоги в других языках, предполагающие использование императивных операторов цикла.
На протяжении всей работы по реализации языка функциональной геометрии Эшера Хендерсона мы немного развивали tinyscheme, различными языковыми конструкциями и ни разу у меня не возникало необходимости использовать Объектно-Ориентированный подход, но вот реализовав абстракцию Фигуры, я понял, что языку tinyscheme очень не хватает объектов и полиморфных функций, потому что данная конструкция не позволяет развивать абстракцию фигуры, расширять различные их варианты. Нет расширять и изменять конечно можно, но придётся постоянно её дописывать и изменять.
С этим нужно было что-то делать. И в этой статье речь пойдёт о первой попытке решить проблему отсутствия нормального ООП в tinyscheme.
Библиотека функций к Script-fu
Мы уже использовали контуры, для вычерчивания кривых линий, для формирования выделений, для закрашивания областей изображения. Но абстракция контура охватывает только позиции(точки), которые можно использовать по своему усмотрению. Пора бы создать абстракцию которая бы объединила возможность рисования контура, кисть, цвет, и тип получаемого изображения, будь это фигура или голый контур. Руководствуясь этими соображениями я объединил в структуре фигуры и окружил её набором функций, создающих абстракцию фигуры.
Одной из особенностей языка Scheme, в отличие от многих других динамических языков и «взрослых» диалектов Лиспа, является лексическая область видимости идентификаторов (как в классических компилируемых языках). С одной стороны, это удобно для статического анализа кода программы и особенно удобно для компиляции. С другой стороны, это затрудняет непосредственные операции с лексическим окружением.
Одной из самых проблематичных операций, реализацию которой затрудняет идеология Scheme, является стандартная для ряда диалектов форма is-bound?
, предназначенная для проверки, определён ли её аргумент, то есть занесён ли он в системный ассоциативный список атомов и, как следствие, имеет ли он вообще какое-либо значение. Рассмотрим, как мы можем реализовать данную форму в Gambit Scheme.
Рассмотрим недавно вошедшую в Gambit Scheme возможность по переопределению семантики скобок.
Gambit Scheme – используемый автором диалект Scheme, имеющий очень быстрый интерпретатор и компилятор с рядом полезных расширений, которые могут быть построены из исходного кода без внешних зависимостей, а также в полной мере поддерживают интернациональные символы UTF-8.
В этой статье мы рассмотрим, как организовать систему для ведения заметок с помощью Emacs и Org-mode. Мы обсудим базовую настройку Emacs для работы с заметками, а также предложим структуру, которая позволит эффективно управлять информацией и проектами. Эта система будет гибкой и легко адаптируемой под ваши нужды, позволяя вам создать персонализированное рабочее пространство.
Библиотека функций к Script-fu
Для отрисовки некоторого изображения в произвольном месте холста изображения это место надо как то определить. Определим рамку в которой мы будем отображать наши контуры или изображения как три вектора, вектор начала координат, вектор обозначающий горизонтальное направление(ось X), вектор обозначающий вертикальное направление(ось Y).