3 ms·
CL has warts, but at least ANSI CL is portable across a dozen implementations, has an excellent IDE and debugger, and lots of other boring “practical” things. S
by reikonomusha 7y ago
CL has warts, but at least ANSI CL is portable across a dozen implementations, has an excellent IDE and debugger, and lots of other boring “practical” things. Scheme is fantastic, if you’re willing to write code that only works for one implementation.
- snazz 7y agoI love that both are feasible options. I’m still not sure which side of the Lisp-1 vs. Lisp-2 debate I’m on, but the fact that there are such great languages on both sides of the fence is wonderful. Also, Scheme communities are more focused; this property proved extremely important to me when I was writing a CHICKEN Scheme web app.
- pfdietz 7y agoScheme is a language in which the order of evaluation of arguments to a function call is not specified by the standard. There is no excuse for that.
- UncleEntity 7y ago> Order of evaluation of the operands of any C operator, including the order of evaluation of function arguments in a function-call expression, and the order of evaluation of the subexpressions within any expression is unspecified (except where noted below). The compiler will evaluate them in any order, and may choose another order when the same expression is evaluated again. Umm...
- pfdietz 7y agoYes, that also sucks. Every undefined behavior in a language standard is a failure of the standard making process, and should be a source of shame. Sometimes it's politically unavoidable (because there are multiple implementations that do something different), or practically unavoidable (the best behavior is not yet known, or impossible to make precise) but every such imprecision is a landmine through which bugs, often insidious ones, can enter programs.
- bjoli 7y agoI believe it stems from an early idea that not specifying it might allow for the compiler to do some optimisations (same reason it is not specified in C). I think it also allows for some freedom in the internal representation for continuation rewriting, and that it now would mean some problems for implementations if a certain way was specified. (Please correct me if I'm wrong about that). It only really matters if you are passing arguments to a function that both read and mutate the same variable. In idiomatic scheme that really only happens with IO or something like srfi-121 styled generators.