From: Robert J. B. <ru...@bb...> - 2004-11-03 23:49:27
|
Ken, While you reference my preferences in your initial note, I think that Geoffrey has a good point. I guess most of my (and your) use cases would be easily satisfied with a macro that was a short-circuit operation like or (didn't evaluate the second or later arguments if it didn't need to) and treated #null as or treats #f. Thus (orJ x y) would return x if x != #null, and y otherwise. This doesn't simplify (if x y z), but Geoffrey's jif would work there... --Rusty Ken Anderson wrote: >This is a good point. This is why i wanted language lawyers/developers to weigh in. > >JScheme has taken the policy of "bending the rules toward Java". My question is, really, is this change worth it from the Java/Scheme perspective and our current code base. > >k > >At 05:59 PM 11/3/2004 -0500, Geoffrey Knauth wrote: > > >>As a practical matter, it certainly seems convenient to be able to treat #null the same as #f in conditionals--I agree it is counterintuitive to have #null be not-false. >> >>But I'm concerned about breaking R5RS 6.3.1., "only #f counts as false in conditional expressions," >> >>http://www.swiss.ai.mit.edu/~jaffer/r5rs_8.html#SEC58 >> >>note: (not '()) ==> #f >> >>and 3.2, "no object satisfies more than one of the following predicates: boolean? pair? symbol? number? char? string? vector? port? procedure?" >> >>http://www.swiss.ai.mit.edu/~jaffer/r5rs_5.html#SEC20 >> >>So we'd have to caveat the language standard, and surprise newcomers to JScheme from other Schemes. On the principle of least surprise, we'd probably be 50-50 between surprising newcomes to JScheme from other languages vs. other Schemes. >> >>In Java you can't do: Object o = NULL; if (o) { true-stuff} else { false-stuff } >>you have to do: if (o == NULL) ... >>It's a pain in the butt, but it's been drilled into us. >> >>Reluctantly, I suggest leaving #null and the semantics of `if' alone, and offering a "new" `if', e.g., `jif', that would treat #null as #f. >> >>By the way, I tried to figure out what #null is in JScheme, and it isn't anything: >> >> >> >>>(symbol? #null) >>> >>> >>#f >> >> >>>(boolean? #null) >>> >>> >>#f >> >> >>>(pair? #null) >>> >>> >>#f >> >> >>>(vector? #null) >>> >>> >>#f >> >> >>>(procedure? #null) >>> >>> >>#f >> >> >>>(string? #null) >>> >>> >>#f >> >> >>>(port? #null) >>> >>> >>(port? '#null) >> ==================================== >>SchemeException: ERROR: undefined variable "port?" >> >> >>>(number? #null) >>> >>> >>#f >> >> >>>(char? #null) >>> >>> >>#f >> >>Then I remembered that the empty list '() isn't anything either, but it also isn't #null: >> >> >> >>>(eq? '() #null) >>> >>> >>#f >> >> >>>(eqv? '() #null) >>> >>> >>#f >> >> >>>(equal? '() #null) >>> >>> >>#f >> >>Geoffrey >>-- >>Geoffrey S. Knauth | http://knauth.org/gsk >> >>On Nov 3, 2004, at 16:32, Ken Anderson wrote: >> >> >> >>>Here's a proposal. >>> >>>I think (and i know Rusty really does) think JScheme handling of #null is awk weird. What if in conditionals we treated #null as #f. This would make code more scheme like, here are 2 examples. >>> >>>#null is currently treated at #t in conditionals but this change may not break much code. >>> >>> >>>(define (default value default) >>> ;; Before >>> (if (isNull value) default >>> value)) >>> >>>(define (default value default) >>> ;; After. >>> (or value default)) >>> >>>(define (memoize key table computation) >>> ;; Before. >>> (let ((it (.get key table))) >>> (if (not (isNull it)) it >>> (let ((it (computation key))) >>> (.put table key it) >>> it)))) >>> >>>(define (memoize key table computation) >>> ;; After. >>> (or (.get key table) >>> (let ((it (computation key))) >>> (.put table key it) >>> it))) >>> >>> > > > >------------------------------------------------------- >This SF.Net email is sponsored by: >Sybase ASE Linux Express Edition - download now for FREE >LinuxWorld Reader's Choice Award Winner for best database on Linux. >http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click >_______________________________________________ >Jscheme-user mailing list >Jsc...@li... >https://lists.sourceforge.net/lists/listinfo/jscheme-user > > > > |