LINUX.ORG.RU

scheme/lisp

 , ,


3

5

Коллеги, добрый день.
Когда-то давно, ещё в универе, был предмет ФЛП, примеры и практика были на чём-то похожем на scheme/lisp или около этого.
Хочу освежить воспоминания и попрактиковать на пет-проектах.
Поэтому прошу подсказать базу и последующие книги в этом направление.
п.с. авось кому этот тред и в будущем пригодится.
Спасибо!

★★★★★
Ответ на: комментарий от kaldeon

Структура и интерпретация компьютерных программ/SICP ?

etwrq ★★★★★
() автор топика

Коллеги, это научная часть или практика?) Я конечно понимаю что всё это в сумме даёт проект/результат. но таки?)

etwrq ★★★★★
() автор топика

Пол Грэм - ANSI Common Lisp.

Но учитывай. что лиспообразные далеко не мейнстрим и что-то свежее есть только на английском и зачастую только в глубинах обсуждений.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

что-то свежее

С этим надо быть осторожнее. Смотрел обзор «свежих» книг по Лиспу - ИИ слоп во все поля. Справедливости ради, тренд «навайбкоженной» технической литературы касается не только Лиспа.

Пол Грэм

Norvig, PAIP Lisp

Но вообще CL Cookbook неплохой (и, кстати, свежий) справочник.

anonymous
()

А, ну и кстати, в r/lisp на Реддите в описании масса ссылок в том числе на туториалы.

И в ленте проскакивает иногда что-то интересное, вот на днях японец, который уже до хрена сколько лет свою реализацию ISLisp мучает, выложил ссылки на Ютьюб с микротуторталом (где-то на самом верху ленты). Сам японец говорит по-английски на редкость убого, и он это знает, так что туториал озвучивал женский TTS (тоже жуть, но лучше японца). Туториал ничего особенного, но для того, чтобы быстро вспомнить что как - наверное годится.

anonymous
()
Ответ на: комментарий от anonymous

Зачем сразу на реддит.

На форчане /g/ есть постоянный лиспотред, вполне себе толковый. В шапке треда подборка инфы

anonymous
()

Благодарю всех за рекомендации и подсказки!
Буду изучать и понемногу практиковать.
Тему отмечаю как решенную.

etwrq ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Добрался до машины.

японец […] с микротуторталом

Easy-Lisp 1 minute tutorial

Туториал ничего особенного, но для того, чтобы быстро вспомнить что как - наверное годится.

Пожалуй, «ничего особенного» - это очень большой комплимент.

Поэтому исправляюсь, вот более интересный и практичный видеотуториал:

Little Bits of Lisp

anonymous
()

наряду с вышепредложенными

Мир Лиспа Хювенена

Функциональное программирование Филд/Харрисон

а в целом достаточно зайти на clojure али ещё какой ФП языка сайт и там раскуриться в туториалах и форумах

зы. аппликативное программирование :)

qulinxao3 ★☆
()
Ответ на: комментарий от err

зелёный магазин х перепосты с ютуба в других местах = выручают)
нашёл практичски всё, сейчас с SICP, визуала, кекаю) ну и книжка переведённая есть по нему.

etwrq ★★★★★
() автор топика
Ответ на: комментарий от err

Я эту систему не знаю. Но теперь почитаю. А, понял

GNU Guix (pronounced «geeks») is a functional package manager and advanced GNU/Linux distribution focused on reproducible, transactional upgrades, and user freedom. It allows installing, configuring, and upgrading software reliably, supporting per-user profiles and full system rollbacks. It is based on Nix, using Guile Scheme for configuration.

Удачи.

saufesma
()
Последнее исправление: saufesma (всего исправлений: 1)
Ответ на: комментарий от saufesma

О, это довольно интересная штука, по сути пакетный менеджер для всего, тебе должно понравиться (там много всяких лисповых библиотек опакечено, все в одном месте - удобно).
Вообще вся система на Guile Scheme запрограммирована, даже инит. Для сборки пакетов там какой-то свой DSL как я понял. В любом случае будет полезно, можно использовать отдельно от самого дистрибутива. Я бы начал с guix shell и манифестов.

err
()
Ответ на: комментарий от err

Ты не поверишь но в scheme я не могу. Я только в common lisp, JavaScript и assembler. Если бы пакеты были бы моими то наверное, да, нужно было бы изучить. Но спасибо за предложение.

saufesma
()
Ответ на: комментарий от lovesan

Не ну sbcl это так, для души так сказать. А для заработка, что используешь Allegro или Lispworks или ещё какой. Если это Lispworks то поделился бы config на то на сё. Был бы признателен.

saufesma
()
Ответ на: комментарий от qulinxao3

к треду и про алголоЛисп:

как чел до сих пор фанатеющий по алгол-дереву языков(схема кста в этом дереве) и уважающий Паскаль и ваще всю ветку языка Вирта ( от эйлера через algol-w и все его пошаговые_улучшения_языка до оберона )

я вообще-то нетипичный лиспер, сызмальства. когда-то, в глубоком детстве в возрасте 5 лет я откопал книжки на антерсоли, прочитал их – и понял, что программазмы это моё. вот Руслан Богатырёв из проекта «Роса OS» про такое говорит, что это «ментальное программирование» – когда сначала в голове, потом код. по-моему, это скорее разновидность литературно-грамотного метапрограммирования как метасистемного перехода к, обобщающего опыт более ранних подходов к программингу и сопутствующих (мета)языков.

первыми пятью прочитанными книжками в возрасте 4.5 лет (весною 1984 г.) были:

  • «язык программирования С», Мартин Болски (и похожего формата Pocketbook A5 «Русско-болгарский разговорник») – прочитал обе, и проникся тем что Си более понятен чем болгарский с языковыми анекдотами :))

ещё не понял про побочные эффекты и «операцию запятая» (с) «Операция пробел» Столяров – вот зачем это? ну, можно в формульное выражение на си напихать , ++ – и прочих, программировать на побочных эффектах, но какой сугубый смысл в отделении , или ; и ещё например трехместной a?b:c – занятная фича, но не совсем ясно для чего нужна. однако же откуда-то повеяло алголом, всеми этими parbegin/parend/par/seq и последовательным или параллельным исполнением.

  • «Практика программирования на Си», Керниган и Пайк – описывали Си+Unix как среду, ещё на K&R Си + задачник и решебник.

собственно, прорешав в 4.5 года задачник «ментальным программированием», и всё поняв с первого раза – я и понял, что программирование это моё, я тут всё понимаю (кажется).

  • «Программирование под OS/360», К. Джермейн (только недавно узнал, что К это Кларенс и вообще тётка) – ещё одна классная книга про среду и практику программирования, почти как философия Unix-way только наоборот, про мейнфреймы и большие машины. описано всё: кодировки, биты, байты, ассемблер и монитор, регистры, автокоды, JCL и PL/1 как монитор и отладчик на «языке воистену высокого уровня намбер ван». проникся подробностью и практичностью подобной среды.

остались вопросы – где бы раздобыть личный майнфрейм или хотя бы ОС ЕС чтобы вживую пощупать? получилось частично из-за плеча набрать по бумажке с блокнотика через года 4, на работе мамы-программиста и знакомых знакомых.

  • «Программирование на языке Фортран», автор то ли Фаронов, то ли Дьяконов. ну да, прикольный физический калькулятор.

  • «Программирование на Паскале», авторы изначальные: Н.Вирт и Йенсен (то ли тоже тётка, то ли тот самый из Jensen & Partners, Borland -> JPI -> TopSpeed).

полкнижки изучали синтаксис паскаля в EBNF, а на семантику и описание среды, как в первых двух книжках – места не хватило. в итоге, по прочтению сего опуса много думал:

двойственное чуйство:

  • программирование на «естественном языке» – это хорошо или плохо? хз, недостаточно информации. с одной стороны, это не формулы на побочных эффектах «операции запятая», это почти полуестественный язык. хотя, лучше бы ЛОГО взяли, ФОРТ или например тот же Алгол-68, полноценный, не урезанный ещё.

  • зачем нужен «упрощённый алгол-68», когда есть полноценный? и вот пространно и развернуто многобуквие программирования на (полу)естественном языке – это хорошо или плохо? с одной стороны, вот Керниган пишет «почему Паскаль не мой любимый язык», про философию юникс-вей, и KISS do one thing, каналы и пайпы; с другой стороны – «настоящие программисты не используют паскаль», лол, кек.

они используют фортран с отрицательными индексами в массивах заради peek или poke, или PL/1 и emit опкодов ассемблера или сразу ассемблер, а не вот эти PL360, Euler, паскалеподобный высокоуровневый ассемблер и недоалголистый паскаль.

anonymous
()
Ответ на: комментарий от anonymous

ну то есть: почему оно так с точки зрения среды. вот например в первых двух книгах весьма подробно описывалась сама среда и тулчейн: что статическая линковка и cc\ar\ld\sh что PL1\ASM OS/360\JCL\MVS/CMS/VM/DOS360.

в этом смысле, для калькулятора на майнфрейме как раз это всё логично.

вот есть у нас фортран и кобол. а потом – унифицируют их в PL/1 := DCL таблиц из кобола + матрично-формульный фортрано-калькулятор.

и есть JCL который запускает в дос-контейнере. у задач есть параметры, их много, потому JCL и data sets и прокидывание файлов в/из «докера» :^) – Это сложна. зато, ДОС запускает пакетно по одной задаче с понятной моделью памяти и рантайм лайбрари языка, средой выполнения ЯП как интерпретатора или конпелятора. и понятно что входит в рантайм и среду и его модель выполнения – на уровне монитора.

например, есть у нас отладчик и даже ассемблер/дизассемблер в самом PL/1 (например, в том же PL/KT). то есть, физически можно поймав исключения обработать их или провалиться в монитор или бы даже в REPL если бы был + интерпретатор PL/1 на самом PL/1 а не только лишь конпелятор и ассемблер и дизассемблер.

отсюда многословность самого PL/1 := код на PL-1 это PL-выражения, ровно так же как и код на лиспе – это код S-выражений кодо-данных, форм унифицированных алголистых M-выражений, где S описывает семантику стандартных форм (+макросы пишущие макросы+) , а M – синтаксис алгололиспа.

занятно, что сам Джон МакКарти с рацпредложением о синтаксисе и семантике лиспа обратился поначалу в сам комитет по стандартизации алгола-60, чтобы вычислять например символьно, не в ленивом или жадном порядке – а в индивидуальном, определяемом самими макросами, FEXPR, FSUBR и вот это всё.

но комитет ниасилил, по видимому, и далее случился хайп вайб и политический демарш – Хоар, Дейкстра и Вирт свалили в структурное программирование писать паскаль, CSP и компилятор алгола,а гото повелели считать вредным.

занятно, что читая Дональда Кнута «Literate Programming» – Он там целую главу пишет про «структурное программирование с гото», и что одно другому не мешает, вообще-то. и про то, откуда ноги растут у запрещаторов гото – META II, Schorr, его VALGOL на META II – в котором Schorr ниасилил гото, и кажется использовал всего пару раз (см. пример про metaII на C vm + конечный автомат по такому алголу).

  • c точки зрения синтаксиса паскаля в Р(Е)БНФ – вроде всё понятно. но язык какой-то урезанный – даже модулей нет.

как можно делать что-то полезное кроме «фортранистово калькулятора» на таком? всё в одном модуле?

anonymous
()
Ответ на: комментарий от anonymous
  • что такое «стандартная библиотека» рантайм лайбрари паскаль среды времени выполнения – и какие накладные расходы вносит «Я» в «ЯВУ» и почему так?

вот с PL/1, например, всё понятно:

PL-выражения это почти как LISP-выражения, только в более free form language, почти как в REXX.

то есть: CALL TASK(JOB) (FOO,BAR,BAZ) PARAM(A,B,C) ; – это просто более кучерявый синтаксис для лиспового S-выражения типа ( (job :task) FOO BAR BAZ (:a A :b B :c C)).

просто синтаксический сахар.

семантически сложность PL в том, что есть исключения, асинхронность, многозадачность, управляемая память, классы памяти, пулы аллокаторы и всё такое прочее.

то есть: вот это – понятные накладные расходы на рантайм накладываемые конструкциями языка.

с другой стороны, есть Си. который простой и понятный переносимый ассемблер высокого уровня – с почти что нулевым рантаймом. в котором только sbrk, alloc/free/alloca/calloc, _atexit, setenv/getenv, ну ещё всякий FILE и stdio. и – даже массивов нормальных, многомерных нет. и – указатели на яблоки = указателями на апельсины, потому что размер их одинаковый, и sizeof(int)=sizeof(void)=sizeof(*) и всё это тянется ещё из BCPL, потому что все переменные там тоже бестиповые, только word=sizeof(anything) в BCPL, и поэтому получается что указатели и значения «совместимы по присваиванию», и указатели разных типов тоже – что есть глупость.

но это понятная контролируемая глупость – которая тянется ещё из ассемблера пополам с BCPL.

anonymous
()
Ответ на: комментарий от anonymous

в общем, насчёт Паскаля по книжке Йенсен, Вирт – с синтаксисом было как раз всё понятно.

непонятки были со средой и семантикой, отсутствием модульности в «фортранистом калькуляторе».

но программирование на (полу)естественном языке – занятная идея. так что – отложил паскали на будущее, пока не понятна практичность.

понятнее с практичностью стало примерно через 4-5 лет, когда прочитал по паскалю книжку-комикс Дональда Алкока «Язык Паскаль в иллюстрациях» и параллельно – «Art of Computer Programming» 1-3 тома Дональда Кнута (где вообще алгол).

то есть: вот все эти алгоритмы и структуры данных, деревья, стеки, очереди …. упакованные строки, лол – в комиксах, в иллюстрациях.

возникла рабочая теория, что просто книжки надо было более другие по паскалю. например, по Турбо Паскалю чтобы пощупать объектное 5.5 и далее 6.0, 7.0, вот все эти турбо вижны и BGI графику.

а по паскалю классическому исо – кроме книжки Дональда Алкока начинать надо было с более других книжек, того же самого Никлауса Вирта, например:

  1. Про построение компиляторов

  2. Про примеры с компилятором P2/P3/P4 где сам исходник написан сам на себе словно метапрог эдакий или похожую книжку по модуле

  3. Про «метрику Вирта»: Конпелятор – это первая и самая полезная программа на некотором новом недоязычке XYZ – просто потому, что оптимизация в ней наносит системный кумулятивный эффект и метасистемный переход во все остальные программы, написанные тоже на нём же.

ну или ещё добавить – первые две самые полезные программы на недо язычке типа паскаля – это pint и pcom. второй по метрике вирта ради оптимизаций – а первый как референсная реализация недоинтерпретатора, в который можно невозбранно тыкать пальцем, когда от тебя просят стандарт языка, его синтаксиса и семантики (включая модель памяти и среды выполнения).

имею утверждать что общераспространённый Паскаль был тот ещё упорыш/

это да: подробности ниже.

anonymous
()
Ответ на: комментарий от anonymous

где бы раздобыть личный майнфрейм или хотя бы ОС ЕС чтобы вживую пощупать?

а они шелл не дают, для студентов/devel?
ну и там субноды/вм есть на их линупсе, думаю обычный кот через детекты ./configure вполне должен работать. это имхо.

etwrq ★★★★★
() автор топика
Последнее исправление: etwrq (всего исправлений: 1)
Ответ на: комментарий от anonymous

имею утверждать что общераспространённый Паскаль был тот ещё упорыш/

  • магические write read c произвольной арностью

  • затупы(унаследованные из алголки и даже может фортрана) при нарушении единобразия когда вызор нульарной функции визуально не отличим от чтения переменной (кстати прям эталонная побочность)

  • и вагон многих ещё лолкеков которые ща уже просто не актуальны и кажутся мелочами либо вообще ушли за горизонт воспоминаний

у меня вот в возрасте 4.5 лет (по прочтении книжки Йенсен, Вирт – много думал.. над семантикой и рантаймом, с синтаксисом в РБНФ как раз всё вроде бы понятно.. хотя, не совсем, там тоже по сравнению с алгол-68 некоторые места довольно таки не логичны: как-то не ортогональненько – и не совсем переносимо, см. про записи с вариантами (см. сравнение Таненбаумом алгола-68 и паскаля на предмет переносимости и стандартной библиотеки, например, стандартного ввода-вывода форматированного через transput с книгами в алголе – и хз чего в паскакале, каждый раз по разному; или про те же записи с вариантами; он впрочем и про downwards funarg problem~ ^H^H^H нелокальные области видимости в алголе и динамические/лексические переменные и их (не)корректность в алголе пишет, а можно было бы ещё и проfirst class objects:=first class types, first class envrinomnents, bindings, modules, classes -- много чего добавить... например: почему что в алголе, что в паскале --процедура, возвращающая значениепо сути своей не является 'first class object где object=function? да потому что чтобы это корректно реализовать, нужны классы памяти, и управляемая память, и продвижение констант во время компиляции или препроцессинга или CTFE AST выражений макросов, или компиляция лямбд через CPS преобразования в closure и continuations, или октопус стеки и прочие банки с червями и тентаклями, что расползуцца что твои тараканы – если делать полноценный конпелятор – c конпелируемыми подфункциями и статическим семантическим анализом подвыражений и побочных эффектов в энтих самих подфункциях

мой личный список претензий к стандартному ISO паскалю по книжке Йенсен, Вирт – был в том, что даже он, лол, кек – не вполне стандартный.

неортогональненько как-то выходит:

магические write read c произвольной арностью

  • это имеет логическое объяснение. просто: есть функции рантайма, встроенные в язык. библиотеки среды выполнения паскаль-среды как абстрактного паскаль-интерпретатора пи-кода паскаль-машины. и его модель памяти, среда выполнения – стандартный репертуар исполнителя по книжке «Основания программирования» Скопина, Непейводы.

тут эти самые writeln(f:n:p,msg) и writeln(a,b,c, ...); и даже 0-арные writeln; – это просто особенности такого рантайма.

вот для своих пользовательских функций в сишке – ты можешь varargs и переменное число аргументов сделать, ибо cdecl calling conv env. а для паскалевских в обычном порядке а не сзаду наперед cdecl — ты не можешь.

особенности рантайма просто – понимать надоть.

то есть: read/readln/write/writeln – и составляют стандартный рантайм исо-паскаля

просто чуть больше чем си, c почти нулевым рантаймом и ортогональненькими printf/puts/putchar совсем немного просто?

а вот твоим определяемым пользователям функциям с Pascal calling conv env – просто не так сильно повезло как этим рантаймовым.

  • затупы(унаследованные из алголки и даже может фортрана) при нарушении единобразия когда вызор нульарной функции визуально не отличим от чтения переменной (кстати прям эталонная побочность)

ну это как раз понравилось, ты можешь ортогональненько писать что переменная, что функция – если функция без параметров.

вот result который в turbo появился сделал ещё более ортогоналистей, не нужно вспоминать как эта this функция каждый раз называется.

но это же опять просто – calling convention? в смысле синтаксиса и семантики.

хотя да, побочность. особенно в дельфях с пропертями, когда чтение геттера или присваивание сеттеру зачем-то совсем другие функции вызывает.

anonymous
()
Ответ на: комментарий от anonymous
  • и вагон многих ещё лолкеков которые ща уже просто не актуальны и кажутся мелочами либо вообще ушли за горизонт воспоминаний

там ещё что-то было с записями с вариантами и вариантным типом, про что написал Таненбаум, но я уже просто не вполне помню.

ну и да, указатели на яблоки и указатели на апельсины. вроде пофиксили, хотя в аде с acccess и address тут более чёткое разделение – указатели типизированны, словно в лиспе с тайптегами.

но в целом, можно сказать что – Вирт попытался таки исправиться. в модулу, обероны активные и пассивные. в обероны-07 встраиваемые.

правда, с модулой-2 тоже возник ряд непоняток:

  • если это - 2 – то где 1 ? и когда будет - 3 ?

  • модули пофиксили наконец-то, и это хорошо. однако ж – где объекты ?

пофиксили в модуле-3

а где – замыкания и продолжения – и акторы, сопрограммы, когенераторы ковыражений?

многозадачность и асинхронность?

пофиксили в MESA, Cedar

где алгололисп? модульный и с паскалесинтаксисом?

пофиксили в : Interlisp-D, Mesa/Cedar, SmallTalk

как унификационное ядро по типу этих ваших PopLog: ML,Lisp, Prolog; SECD LispKit (на паскале, кстати) и машины Ландина, ( zetaLisp, MacLisp, InterLisp ) >== Common Lisp, Portable Standard Lisp (странная чушь где portable: T, Standard: NIL), Scheme где почему-то акторы, CSP, «акторная модель лямбда-исчисления», замыкания, продолжения, модульные макросы с define-syntax и синтаксическими объектами, композабельность, ортогональность, SICP-метацикличность с 3-Lisp и first class environments — ну и где вот это вот всё?

узок их круг, и страшно далеки от народа.

почитал вот статистику про японские компьютеры 5-го поколения, FGCS. про первый этап 1980-1993 и второй перезапуск 1993-1999. параметры проектов и их практический выхлоп.

я что-то не понял: что там, было порядка 10 000 человеков, из которых всего примерно <100 программеров? и из них на самом прологе – от силы, <10 ?

ну, тогда и понятно – отчего не взлетело.

сам «параллельный пролог» и транспьютеры – язык мутировал в Mercury. ещё была какая-то СУБД на прологе, Quixote, кажется.

ещё была какая-то ос на языке, с си интеграцией. по идее в нечто типа FoNC/STEP могла бы развиться, если бы.

а больше как-то особого выхлопа из FGCS и не видно было.

может потому что – просто нужно больше программеров? на самом прологе, вот и изобрели бы нечто вроде LogTalk – на десяток лет раньше.

anonymous
()
Ответ на: комментарий от anonymous

Паскаль продукт эпохи больших машин - и при начальной тормазнутости cc и даже pcc у последних при всём Сяшном кракозаберном синтаксисе(особенно по практическим удобствам вот та самая спираль парсинга вызовов и обьявлений) сяшка разрабатывалась на условно-персональной системе и поэтому так удачно зашла на персоналках - форт частично поэтому тож ну и ещё к меньшему размеру памяти заточенный

тут ещё интересно про дистрибутивы и дистрибуции, как про вино и бутылки.

такое ощущение, что сам Никлаус Вирт активно препятствовал коммерциализации – ну наколбасили P2/P3/P4 pint/pcom и пи-код пи-машины, дальше-то что?

дальше – сделали дистрибутив. UC SD на Apple ][ – почти как B SD на Unix cc/as/ld/ar.

и что мы там видим? да так себе даже по сравнению с MESA/Cedar.

ну, появляются ещё альтернативные имплементации :

  • Apple ThinkPascal

  • Odersky->Borland->JPI->TopSpeed CPM/DOS Turbo/Borland Pascal

и далее пролог, модула, JPI/TopSpeed

со всякими там

  • Virtual Pascal, TMT Pascal

  • Delphi/Kylix

  • Modula-2 => Power++ Optima++ Watcom , TopSpeed->кларионы , 4GL, Oxygen

  • ну и всякие там критикал масс модулы-3, обероны-2 и 07 – пассивные ч0рноящиковые и активные акторные синебутылочные.

но, сам язык тот же активный оберон уже как-то усложняется в сторону ады или алгола-68, Mesa/Cedar.

так – за что боролись и на что напоролись – со структурным программированием, структурным объясненением, модульностью, компонентностью, separate а не independent конпеляцией модулей и подфункций,

– вот это вот всё?

имхо, вот этот же оберон надо было сразу невозбранно переписывать – и не на модуле-2 как в той же XDS excelsior/mithril/xerion Modula-2/Oberon-2

– или в JPI/TopSpeed Pascal/C/Modula-2 или там Странник, Глаголъ и проч.

— а : переписывать сразу на Аде (ну или модульном Алголе-68 : gcc 16 ga68 marst)

у эталонного Паскаля ваще кстати отсутсвола модульность - т.е ровно как в Сяшке ожидались текстовые инклюды

более того Паскаль изначально как и все языки той эпохи не предпологает наличия ОСи

и это тянется ещё с JCL и майнфреймов ДОС360 и «дата сетов в докере VM/CMS» :))

anonymous
()
Ответ на: комментарий от qulinxao3

у эталонного Паскаля ваще кстати отсутсвола модульность - т.е ровно как в Сяшке ожидались текстовые инклюды

более того Паскаль изначально как и все языки той эпохи не предпологает наличия ОСи

и это тянется ещё с JCL и майнфреймов ДОС360 и «дата сетов в докере VM/CMS» :))

занятно в энтом контексте перечитывать «Literate Programming» Дональда Кнута, почитывая параллельно сами сорцы метапроцессора метасистемного перехода : «TeX, the program and the book» := weaved tex.web, и tex-fpc: где weave tex.web -> texbook.pdf , tangle tex.web + патчи в change-файле tex-fpc.ch -> tex.p и даже аналогично собирается metafont, и конфиги, шрифты, для минималистичного plain tex комплекта с примерами.

и – сами сорцы WEB изначального : tangle.web, weave.web + tex.web + metafont.web

вот если рассматривать это в контексте истории, описанной в «Literate Programming» в отдельных главах. он там ещё довольно подробно про «структурное программирование с goto» пишет и в самом tangle.web и далее всю дорогу это встречается.

то что за тулинг фактически изобрёл себе Дональд Кнут когда делал «инструменты для инструментов»?

он вообще-то просто хотел писать книжки. про ars и tekno, различия между art и science вот это всё. энциклопедию алгоритмов, хоть на алголе, хоть на MMIX, хоть вообще на каком угодно псевдокоде ментального программирования.

у них был свой алгол, на котором он в 1970х набросал прототип, и стал почти в одиночку в 1980х переписывать на паскаль.

  • формата электронной бумаги стандартов и форматов нормальных не было – изобрёл DVI

  • шрифтов тоже не было – изобрёл METAFONT

  • кодировок нормальных не было – изобрёл T2A и TeX encoding ( + cork encoding, лол, кек) и диграфами.

это уже потом появился PostScript как функциональный форт со своей display model и потом на его основе – Display PostScript и далее, PDF как компилируемый PostScript (который вообще dict с OID объектов с откомпилированными байткодами и сжатыми строками, постранично, поглавно (ну а потом и формы и JavaScript и прочее ) а так вообще-то та же самая Display Model, что и в PS.

ну да, намудрили немного с кодировками и шрифтами в t1. но в целом, вполне ничего.

уникод тоже изобрели гораздо позже, как и на utf8 пошла мода из plan 9 переводить, лишь бы нормальные 8-bit free не делать.

в этом смысле, Кнут поступает логично: когда изобретает свои велосипеды. ведь альтернатив в то время ещё попросту не существовало.

затем он делает свой инструмент для сборки инструментов.

вот tangle.web хорошо перечитывать (стоя на тумбочке: вслух, с выражением! :)) , перемежая чтение с чтением исходников самих изначальных pint/pcom: P2,P3,P4 … и более современных P5,P6 со standardpascal.org.

в смысле: написаны в похожем чем-то стиле: опять строки массивами и руками по нужным индексам по таким слайсам строк лазим.

anonymous
()
Ответ на: комментарий от anonymous

в целом, что изобрёл Дональд Кнут в tangle.web + weave.web ?

метасистемный переход для текстового препроцессора – в гипертекстовый, компилируемый, а не интерпретируемый.

как устроен tangle.web?

  1. сам WEB – это метаязык для объектных языков: блоков кода на паскале и блоков данных на tex.

его метаязык, это метаметаязык описания грамматики в виде контрольных кодов WEB:

всехъ этих @@ @'123 @"AB @\ @{ @} @пробел @таб @* @.string@> @!id:type @<codeblock name@>= @<codeblock name@>+= @d макро(#,#)==\1 @& \2 ; @& @d тожемакро= @f новыйPP = старыйPP @p @<inset codeblock...@> и т.п. change @x old @y new @z end

  1. делаем пул строк массивом байт, заполняем вручную

  2. нормализуем строки: склеиваем пробелы, подставляем цитирование контрольных кодов, и, возможно, @d макросы. и паскалевские диграфы. и @{ комментарии с прагмами @} – обычные комментарии просто выкидываем.

  3. строки, идентификаторы, названия модулей блоков кода – храним в таком пуле строк.

  4. обрабатываем только те контрольные коды, которые нужны (в tangle только нужные, в weave – чуть более подробные для индексов и оглавления, ссылок)

  5. в момент материализации – раскручиваем блоки кода в нужном порядке, по включаемым именам.

  6. и не забываем применять патч в change-файле с диффами.

здесь тоже в целом, довольно простенько, наглядно и понятно.

anonymous
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария