diff --git a/input.scm b/input.scm index b6fcb76..a2f16ce 100644 --- a/input.scm +++ b/input.scm @@ -70,3 +70,6 @@ x (null? (quote ())) (null? (list)) + +(symbol? (quote null)) +(symbol? 1) diff --git a/proc.go b/proc.go index 8fa110e..1d8a695 100644 --- a/proc.go +++ b/proc.go @@ -132,3 +132,12 @@ func isnull(vals []interface{}) (interface{}, error) { return len(s) == 0, nil } + +func issymbol(vals []interface{}) (interface{}, error) { + if err := checkArity(1, vals, "symbol?"); err != nil { + return nil, err + } + + _, ok := vals[0].(symbol) + return ok, nil +} diff --git a/skeam.go b/skeam.go index dc65636..31c56c1 100644 --- a/skeam.go +++ b/skeam.go @@ -21,18 +21,24 @@ func (s sexp) String() string { type symbol string var universe = &environment{map[symbol]interface{}{ - "#t": true, - "#f": false, - "null": nil, - "+": builtin(addition), - "-": builtin(subtraction), - "*": builtin(multiplication), - "/": builtin(division), - "length": builtin(length), - "list": builtin(list), - "list?": builtin(islist), - "not": builtin(not), - "null?": builtin(isnull), + // predefined values + "#t": true, + "#f": false, + "null": nil, + + // builtin functions + "+": builtin(addition), + "-": builtin(subtraction), + "*": builtin(multiplication), + "/": builtin(division), + "length": builtin(length), + "list": builtin(list), + "list?": builtin(islist), + "not": builtin(not), + "null?": builtin(isnull), + "symbol?": builtin(issymbol), + + // special forms "begin": special(begin), "define": special(define), "if": special(_if),