Documentation ¶
Index ¶
- Variables
- func AtomP(o Any) bool
- func Bool(o Any) bool
- func Eq(o Any, a Any) bool
- func ListLen(a Any) int
- func Log(format string, args ...interface{})
- func NullP(o Any) bool
- func ParseExprs(toks []Tok) (string, []Tok, []Any)
- func Serial(prefix string) string
- func Stringify(o Any) string
- func ToFloat(o Any) float64
- func ToInt(o Any) int
- func ToStr(o Any) string
- type Any
- func Apply(o Any, args []Any, env *Env) Any
- func ApplyFunc(o *Func, args []Any, env *Env) Any
- func ApplyPrim(o *Prim, args []Any, env *Env) Any
- func ApplySpecial(o *Special, args []Any, env *Env) Any
- func CallCC(args []Any, env *Env) Any
- func Eval(o Any, env *Env) Any
- func EvalLambda(params []Any, body Any, env *Env) Any
- func Get(o *Pair, key *Sym) (Any, bool)
- func Head(o Any) Any
- func LispyBool(b bool) Any
- func ListToVec(a Any) []Any
- func ParseFile(filename string) []Any
- func ParseText(text, filename string) []Any
- func Repl(terp *Terp, r io.Reader) []Any
- func Tail(o Any) Any
- func Throw(o Any, format string, args ...interface{}) Any
- func TryReplEval(terp *Terp, xs []Any) (result Any, err interface{})
- func TryReplParse(s string) (xs []Any, ok bool)
- func VecToList(a []Any) Any
- type ContinuationUsed
- type Env
- type Func
- type Pair
- type Prim
- type ProtoFunc
- type Special
- type Sym
- type Terp
- type Tok
- type Var
Constants ¶
This section is empty.
Variables ¶
View Source
var ( // Traditionally NIL would be a special *Sym, // but in this Lisp it will be a special *Pair. // It is not Interned. The parser will have to know // about this special name. AtomP(NIL) is still true, // although it cannot be used as an environment key. NIL = &Pair{} // Address matters; contents do not. FN = Intern("fn") // In other Lisps, this is lambda. TRUE = Intern("true") // In other Lisps, this is T or *T*. DEF = Intern("def") // Special to the REPL; it modifies the env. DEFUN = Intern("defun") // Special to the REPL; it modifies the env. )
View Source
var BuiltinFloatingBinaryOps = map[string]func(float64, float64) float64{ "+": func(a, b float64) float64 { return a + b }, "-": func(a, b float64) float64 { return a - b }, "*": func(a, b float64) float64 { return a * b }, "div": func(a, b float64) float64 { return a / b }, "mod": func(a, b float64) float64 { return math.Mod(a, b) }, }
View Source
var BuiltinFloatingRelOps = map[string]func(float64, float64) bool{ "<": func(a, b float64) bool { return a < b }, "<=": func(a, b float64) bool { return a <= b }, "==": func(a, b float64) bool { return a == b }, "!=": func(a, b float64) bool { return a != b }, ">": func(a, b float64) bool { return a > b }, ">=": func(a, b float64) bool { return a >= b }, }
View Source
var BuiltinPrims = map[string]func([]Any, *Env) Any{ "call/cc": CallCC, "list": func(args []Any, env *Env) Any { z := NIL for i := len(args) - 1; i >= 0; i-- { z = Snoc(z, args[i]) } return z }, "null?": func(args []Any, env *Env) Any { MustLen(args, 1) return LispyBool(NullP(args[0])) }, "atom?": func(args []Any, env *Env) Any { MustLen(args, 1) return LispyBool(AtomP(args[0])) }, "eq": func(args []Any, env *Env) Any { MustLen(args, 2) return LispyBool(Eq(args[0], args[1])) }, "head": func(args []Any, env *Env) Any { MustLen(args, 1) return Head(args[0]) }, "tail": func(args []Any, env *Env) Any { MustLen(args, 1) return Tail(args[0]) }, "1st": func(args []Any, env *Env) Any { MustLen(args, 1) return Head(args[0]) }, "2nd": func(args []Any, env *Env) Any { MustLen(args, 1) return Head(Tail(args[0])) }, "3rd": func(args []Any, env *Env) Any { MustLen(args, 1) return Head(Head(Tail(args[0]))) }, "4th": func(args []Any, env *Env) Any { MustLen(args, 1) return Head(Head(Tail(Tail(args[0])))) }, "5th": func(args []Any, env *Env) Any { MustLen(args, 1) return Head(Head(Tail(Tail(Tail(args[0]))))) }, "eval": func(args []Any, env *Env) Any { MustLen(args, 1) return Eval(args[0], env) }, "apply": func(args []Any, env *Env) Any { MustLen(args, 2) return Apply(args[0], ListToVec(args[1]), env) }, "snoc": func(args []Any, env *Env) Any { MustLen(args, 2) p, ok := args[0].(*Pair) if !ok { Throw(args[0], "cannot Snoc") } return Snoc(p, args[1]) }, "cons": func(args []Any, env *Env) Any { MustLen(args, 2) p, ok := args[1].(*Pair) if !ok { Throw(args[1], "cannot Cons") } return Snoc(p, args[0]) }, "sum": func(args []Any, env *Env) Any { sum := 0.0 for _, a := range args { sum += ToFloat(a) } return sum }, "product": func(args []Any, env *Env) Any { product := 1.0 for _, a := range args { product *= ToFloat(a) } return product }, }
View Source
var BuiltinSpecials = map[string]func([]Any, *Env) Any{ "quote": func(args []Any, env *Env) Any { MustLen(args, 1) return args[0] }, "and": func(args []Any, env *Env) Any { z := Any(TRUE) for _, a := range args { x := Eval(a, env) if NullP(x) { return NIL } z = x } return z }, "or": func(args []Any, env *Env) Any { for _, a := range args { x := Eval(a, env) if Bool(x) { return x } } return NIL }, "all": func(args []Any, env *Env) Any { for _, a := range args { if NullP(Eval(a, env)) { return NIL } } return TRUE }, "any": func(args []Any, env *Env) Any { for _, a := range args { if Bool(Eval(a, env)) { return TRUE } } return NIL }, "if": func(args []Any, env *Env) Any { for len(args) >= 2 { pred := Eval(args[0], env) if Bool(pred) { return Eval(args[1], env) } args = args[2:] } MustEq(len(args), 1) return Eval(args[0], env) }, }
View Source
var FlagVerbose = flag.Bool("v", false, "verbosity")
View Source
var InternTable = make(map[string]*Sym)
var Globals = make(map[string]Any)
Functions ¶
Types ¶
type ContinuationUsed ¶
type ContinuationUsed string // for exiting thread.
type Func ¶
type ProtoFunc ¶
type ProtoFunc struct { Outer *ProtoFunc Params []*Sym Values []Any // Only for Let Body Any Name string IsLet bool }
func PreprocessFunc ¶
Click to show internal directories.
Click to hide internal directories.