newLISP Fan Club

Forum => Whither newLISP? => Topic started by: Kazimir Majorinc on June 24, 2014, 10:34:12 PM

Title: Is true symbol?
Post by: Kazimir Majorinc on June 24, 2014, 10:34:12 PM
> (symbol? 'true)

true

> (symbol? (eval 'true))

nil


> (= 'true (eval 'true))

true




Is it bug or feature? I'd expect that true is always symbol.
Title: Re: Is true symbol?
Post by: hugh.jf.chen on June 24, 2014, 11:34:44 PM
True is a symbol. (eval 'true) is a expression. Since symbols are also expressions,so the = return true. I feel make sense.
Title: Re: Is true symbol?
Post by: Lutz on June 25, 2014, 06:01:38 AM
In newLISP the writing for the symbols true and nil and the boolean values true and nil is the same. Because of this, the symbols should also equal their boolean values:



> (set 'lst (list true 'true nil 'nil))
(true true nil nil) ; symbols and boolean values are indistinguishable to the eye

> (map symbol? lst)
(nil true nil true) ; lst contains both, boolean values and symbols

> (map nil? lst)
(nil nil true true) ; both equal the same boolean value

> (map true? lst)
(true true nil nil) ; both equal the same boolean value
Title: Re: Is true symbol?
Post by: rickyboy on June 25, 2014, 07:53:49 AM
At least you can't do this (by default).


> (let (true nil) true)

ERR: symbol is protected in function let : true
> (let (true 'maybe) true)

ERR: symbol is protected in function let : true
>

:)))))



Hello, Kazimir!  Good to hear from you again.
Title: Re: Is true symbol?
Post by: rickyboy on June 25, 2014, 08:26:13 AM
Here are the ways two other languages treat this issue.



In Common Lisp, apparently T and NIL are also symbols.


$ /opt/ccl/wx86cl64.exe
Welcome to Clozure Common Lisp Version 1.9-r15765  (WindowsX8664)!
? (symbolp t)
T
? (symbolp 't)
T
? (symbolp nil)
T
? (symbolp 'nil)
T
?

Not so, in this implementation of Scheme.


$ /opt/Racket/mzscheme
Welcome to Racket v5.3.5.
> (symbol? #t)
#f
> (symbol? '#t)
#f
> (boolean? #t)
#t
> (boolean? '#t)
#t
> (boolean? #f)
#t
>

Apparently, in Scheme, both #t and #f belong to a type (informal?) called boolean and they are NOT symbols (i.e. do not belong to the symbol type), although they sort of look like self-evaluating symbols.  Interesting.



In newLISP, true and nil are self-evaluating, but they are not symbols.  At least they are not symbols strictly speaking (cf. Lutz's example true versus 'true, where the latter is a symbol).  This situation is more in line with the Scheme design choice, except where its boolean value #t is not a symbol when quoted, but newLISP's true is.  Again, interesting.