conditional bindings
Per Bothner
per@bothner.com
Thu Dec 11 04:38:00 GMT 2014
On 12/10/2014 08:04 PM, Jamison Hope wrote:
> More interesting behavior, trying different variable names:
>
> #|kawa:1|# (let ((x 0+0i)) (if (? r ::real x) r +nan.0)) ;; x, r works
> 0
> #|kawa:2|# (let ((r 0+0i)) (if (? r ::real r) r +nan.0)) ;; r, r works
> 0
> #|kawa:3|# (let ((x 0+0i)) (if (? ? ::real x) ? +nan.0)) ;; x, ? works
> 0
> #|kawa:4|# (let ((? 0+0i)) (if (? r ::real ?) r +nan.0)) ;; ?, r fails
> /dev/stdin:4:24: warning - no declaration seen for r
> /dev/stdin:4:26: warning - no declaration seen for ::
> /dev/stdin:4:17: warning - no declaration seen for r
> /dev/stdin:4:24: unbound location: r
> at gnu.mapping.SharedLocation.get(SharedLocation.java:22)
> at gnu.mapping.DynamicLocation.get(DynamicLocation.java:28)
> at atInteractiveLevel$4.run(stdin:4)
> at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:317)
> at gnu.expr.ModuleExp.evalModule(ModuleExp.java:219)
> at kawa.Shell.run(Shell.java:291)
> at kawa.Shell.run(Shell.java:203)
> at kawa.Shell.run(Shell.java:184)
> at kawa.repl.main(repl.java:892)
> #|kawa:5|# (let ((? 0+0i)) (if (? ? ::real ?) ? +nan.0)) ;; ?, ? fails differently
> /dev/stdin:5:26: warning - no declaration seen for ::
> /dev/stdin:5:26: unbound location: ::
> at gnu.mapping.SharedLocation.get(SharedLocation.java:22)
> at gnu.mapping.DynamicLocation.get(DynamicLocation.java:28)
> at atInteractiveLevel$5.run(stdin:5)
> at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:317)
> at gnu.expr.ModuleExp.evalModule(ModuleExp.java:219)
> at kawa.Shell.run(Shell.java:291)
> at kawa.Shell.run(Shell.java:203)
> at kawa.Shell.run(Shell.java:184)
> at kawa.repl.main(repl.java:892)
Looks correct to me ... If you redefine ? then it is just a regular identifier.
I.e.
(let ((? 0+0i)) (if (? r ::real ?) r +nan.0))
is the same as:
(let ((x 0+0i)) (if (x r ::real x) r +nan.0))
Remember - Scheme has no reserved identifiers.
--
--Per Bothner
per@bothner.com http://per.bothner.com/
More information about the Kawa
mailing list