Is true symbol?

Started by Kazimir Majorinc, June 24, 2014, 10:34:12 PM

Previous topic - Next topic

Kazimir Majorinc

> (symbol? 'true)

true

> (symbol? (eval 'true))

nil


> (= 'true (eval 'true))

true




Is it bug or feature? I'd expect that true is always symbol.
http://kazimirmajorinc.com/\">WWW site; http://kazimirmajorinc.blogspot.com\">blog.

hugh.jf.chen

#1
True is a symbol. (eval 'true) is a expression. Since symbols are also expressions,so the = return true. I feel make sense.

Lutz

#2
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

rickyboy

#3
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.
(λx. x x) (λx. x x)

rickyboy

#4
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.
(λx. x x) (λx. x x)