4 ms·
I've sometimes done the opposite - when working in scheme/racket, searched for implementations of things like loop, defmacro or tagbody. (They have their quirks
by wavemode 2y ago
I've sometimes done the opposite - when working in scheme/racket, searched for implementations of things like loop, defmacro or tagbody. (They have their quirks, but when they're a good fit for a problem they can save a lot of typing.)
- bjoli 2y agoDefmacro is trivial to implement in syntax-case, but you are in for a world of pain if you want to use bindings across modules. In have an implementation of tagbody for guile scheme somewhere, using delimited continuations. I have seen it for racket as well. There is an implementation of loop for racket, but it relies heavily on set! which will tank performance, since chez and racket (and many schemes) is pretty bad at not boxing mutable values. I wrote this which is definitely not as powerful as loop, but definitely more powerful than rackets for loops: https://git.sr.ht/~bjoli/goof-loop https://git.sr.ht/~bjoli/goof-loop
- rmrfchik 2y agoDefmacro isn't hygienic, while syntax- is. Is there way to use arbitrary names in hygienic syntax- macros?
- shawn_w 2y agoIf you know the name ahead of time, syntax parameters[1] (if your scheme supports them) work well. syntax-case lets you break hygiene to insert new names in a controlled fashion (but has issues with names known ahead of time; see linked paper). Renaming macros do too, I believe. 1: http://scheme2011.ucombinator.org/papers/Barzilay2011.pdf http://scheme2011.ucombinator.org/papers/Barzilay2011.pdf
- bjoli 2y agosyntax-case can introduce arbitrary bindings using datum->syntax.
- shawn_w 2y agoChicken has a Common Lisp style `loop` egg: https://wiki.call-cc.org/eggref/5/loop https://wiki.call-cc.org/eggref/5/loop I think it's based on a more generic Scheme version but I don't have a link to the original. SLIB has an implementation of pretty much the entirety of CL's `format` that I ported to Racket: https://docs.racket-lang.org/slib-format/index.html https://docs.racket-lang.org/slib-format/index.html I also implemented a bunch of other CL stuff for Racket in https://docs.racket-lang.org/soup-lib/index.html https://docs.racket-lang.org/soup-lib/index.html (but not `tagbody`. Yet.)
- kazinator 2y agoOops! Chicken is BSD licensed, but this is GPL. If you ship a program that includes this, it is tainted. Possibly, the code generated by the loop macro doesn't fall under the license, but you still have to ensure that the macro itself is scrubbed from your application.
- shawn_w 2y agoOr... Just release your program under the GPL.