всё к тому, что понадобился мне (не поверите, трезвый как стекло для дела) мелкий скриптовый язычок в софтину. «мелкий» — это кил на 30 бинарника чтобы, но одновременно нормальный. подумал, я, конечно, о Схеме, поискал в интернетах — ну или оооочень ёбнутые, или большие. в итоге за пару дней написал и успешно встроил.
но, как известно, творческая мысль шило в жопе — это ужасно. в итоге — можете смотреть на гиториусе, PicoScheme. практически полная R4RS (нет типа char — его целое заменяет пока; не уверен, может так и оставлю). для адских числодробилок не пойдёт, но сама по себе не такой уж дикий тормоз. порты i/o внутре есть, нет только примитивов для их создания — сами допилите. местами даже раскиданы комментарии, иногда верные. но вообще — читайте исходник, он маленький. доки от R4RS пойдут, надо только помнить, что макросы — a-la CommonLisp, char и fixnum — почти одно и то же, а #f — то же самое, что '() и что ().
также встроено моё любимое автоцитирование: список, начинающийся не с пары и не с символа, автоцитируется. векторы, заданые через #(…) — тоже автоцитированы (в отличие от стандартов).
размер бинаря с gcc -Os -s сейчас примерно 60 kb. на x64 не проверялось.
valgrind'ом прошёлся.
компилябельность на не-gcc не гарантирую, но старался gcc-фишки не использовать, где надо — оборачивать ifdef'ами.
в принципе, в наборе есть пример REPL, он же — пример расширения ядра. там лежат полезные вещи типа LOAD и утилитных функций.
ах, чуть не забыл: лицензия. WTFPL, конечно же.
зыж понятно, что это всё нахуй никому не надо, скорее всего, но вдруг да пригодится? если бы я нарыл в сетке подобное и под нормальной лицензией, то своё бы не ваял, например..
Anyway, here's your «gif» in Scheme. (There are several ways to define macros in PLT Scheme, but «syntax-rules» is quick and fun for simple tasks like this.)
#lang scheme/base
;; by neil AT neilvandyke DOT org, 2009-10-25
;; Contributed to Public Domain
(define-syntax %syntax-error (syntax-rules () ((_) (error))))
(define-syntax gif
(syntax-rules ()
((_) (values))
((_ X) X)
((_ X …) (%gif:2 (X …) ()))))
(define-syntax %gif:2
(syntax-rules ()
((_ () O) (%syntax-error «gif must have odd number of arguments»))
((_ (I) (O …)) (cond O … (else I)))
((_ (T V I …) (O …)) (%gif:2 (I …) (O … (T V))))))
да, эта срань проверяет количество аргументов. плюс одна строка к оригинальной CL-версии, угу.
никогда не мог понять, отчего люди так хотят усложнить себе жизнь во имя неких «концепций». да, шаблономакры с гигиеной иногда удобны. однако это: а) ещё один язык для изучения (и часто результат является write-only code); б) допизды сложен в реализации (сравнительно с «обычными» макрами); в) тормозят.
в общем, эту хуйню можно иметь, но не обязательно. мне кажется, что-то в этой консерватории не продумали.
зыж да, я могу писать подобную лапшу. но предпочитаю обычные макры..
как известно, в R6RS ребиндинг запрещён. более 20 лет с этим не было проблем, а тут внезапно! решили, что больше нельзя. компьютеры ведь становятся всё медленней, и то, что нормально работало 20 лет назад, сейчас, очевидно, будет дико тормозить.
кстати, REPL оттуда выкинули тоже (если ваша Схема говорит, что она R6RS и при этом имеет REPL, то это не R6RS, вот так).
вообще, направление таково, чтобы можно было писать компиляторы попроще. а то ведь компилятор перетрудится, бедняга. я, правда, всегда считал, что просто и удобно должно быть программисту.
вообще, я подозреваю, чей мерзкий ебальник светится за этой хуитой. как и за дебильными шаблономакрами, да. по моим подозрениям это тот, кто немножечко торгует своей сраной проприетарщиной. поскольку открывать код оно не желает, оно предпочитает протаскивать в стандарт те фичи, которые допилило у себя в системе (а также фичи, которые его система хорошо умеет). думаю, не надо пояснять, зачем.
самыми вменяемыми, кстати, оказались авторы Chicken и SCM. потому что послали нахуй уебанов вместе с их R6RS. остальные, блядь, подставили жопу и славят «улучшения языка».
то есть, из более-менее серьёзных систем на выбор остался один интерпретатор и один компилятор. печально.
естественно, в улучшение ситуации после R7RS я не верю: мерзкий ебальник-то никуда не делся.
впрочем, я допускаю, что мои подозрения неверны. но вероятность очень мала, тащемта..
была идея сделать серию псото про «как перестать бояться и написать себе компилятор Scheme», но потом я передумал. в основном потому, что: а) такого материала дохуя уже (люди! читайте SICP! хотя бы!); б) те, кому это надо, и так знают, где найти; а кому не надо — те и читать не будут; в) очень лень разношёрстные заметки, сделаные на помеси русского, английского и эльфийского приводить в нормальный вид.
в основном, конечно, виноват последний пункт. кабы можно было выложить в том виде, как есть… но это X-Rated секрктные материалы, всё равно никто, окромя меня, расшифровать не сможет.
да, компилятор в VM, простой, но достаточно шустрый, бутстрапится сам собой и на себе же написан, с «нормальными» и «гигиеническими» макросами, умеет call/cc. VM и примитивы на сях, остальное на схеме. пишется, кстати, за несколько дней — если знать, как. жаль, что я очень больное на голову (не, в прямом смысле, в голове куча трещин и там танцуют мамонты). а то «у меня ещё столько идей было»…
кстати, посмотрел код. один из весьма редко использующихся операторов — присваивание. после того, как у меня появились named lets, реже встречается только while.
а суть в том, что: «понадобилась однажды техноэльфу Scheme, да маленькая, да чтобы в c/c++ встраивалась». и я понял, отчего почти все embeddable Schemes такие жирные: просто очень трудно остановиться: «вот щаз вот эту фишечку допишу, и у меня СТОЛЬКО всего заработает!»
и всё заверте…
зыж пока держусь в районе 90 кил бинаря и 150 кил бутстрапа в псевдотекстовом псевдокоде.
как известно (оттуда, оттуда), MIT выкинули же Scheme из 6.001 и захуячили заместо этого бидон.
ну, то есть, пропал калабуховский дом. самоочевидно, что обучение программингу на бидоне — это травма не хуже васика прошлых декад. за что в MIT так ненавидят студентов?
учитывая, что гнида ван россум даже не знает, зачем нужна хвостовая рекурсия (да-да, у него в бложеге так и написано), становится кристально ясно, что бидон был придуман идиотом для идиотов.
конечно, даже идиоты могут писать относительно рабочие программы. наглядное доказательство тому — сегодняшнее состояние софтвера. sapienti sat.
уж пардон, ссылки расставлять лень.
зыж если вдруг кто-то таки меня ещё читает, и у кого-нибудь зачешутся лапки написать мне, что хвостовая рекурсия — это просто такие циклы, только написаные через жопу (хвост), то не утруждайте себя: я не буду ни пояснять, ни дискутировать по этому поводу. идите дальше дрочите свои жавы, бидоны и прочие игрушки для недоразвитых..