как известно, в R6RS ребиндинг запрещён. более 20 лет с этим не было проблем, а тут внезапно! решили, что больше нельзя. компьютеры ведь становятся всё медленней, и то, что нормально работало 20 лет назад, сейчас, очевидно, будет дико тормозить.
кстати, REPL оттуда выкинули тоже (если ваша Схема говорит, что она R6RS и при этом имеет REPL, то это не R6RS, вот так).
вообще, направление таково, чтобы можно было писать компиляторы попроще. а то ведь компилятор перетрудится, бедняга. я, правда, всегда считал, что просто и удобно должно быть программисту.
вообще, я подозреваю, чей мерзкий ебальник светится за этой хуитой. как и за дебильными шаблономакрами, да. по моим подозрениям это тот, кто немножечко торгует своей сраной проприетарщиной. поскольку открывать код оно не желает, оно предпочитает протаскивать в стандарт те фичи, которые допилило у себя в системе (а также фичи, которые его система хорошо умеет). думаю, не надо пояснять, зачем.
самыми вменяемыми, кстати, оказались авторы Chicken и SCM. потому что послали нахуй уебанов вместе с их R6RS. остальные, блядь, подставили жопу и славят «улучшения языка».
то есть, из более-менее серьёзных систем на выбор остался один интерпретатор и один компилятор. печально.
естественно, в улучшение ситуации после R7RS я не верю: мерзкий ебальник-то никуда не делся.
впрочем, я допускаю, что мои подозрения неверны. но вероятность очень мала, тащемта..
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); б) допизды сложен в реализации (сравнительно с «обычными» макрами); в) тормозят.
в общем, эту хуйню можно иметь, но не обязательно. мне кажется, что-то в этой консерватории не продумали.
зыж да, я могу писать подобную лапшу. но предпочитаю обычные макры..