Golang LISP Interpreter
GLISP is a LISP interpreter I implemented in the Go programming language.
It was designed as an embedded extension language for Go. It features a
hand-rolled lexer and parser and executes on a simple stack-based virtual
machine. The language features Clojure-like syntax, proper tail-call
optimization, and an easy-to-use Go API.
The code can be found on Github .
; factorial algorithm implemented in GLISP
; using tail recursion
( defn factorial-loop [ n acc ]
( cond ( = n 0 ) acc
( factorial-loop ( - n 1 ) ( * n acc ))))
( defn factorial [ n ]
( factorial-loop n 1 ))
package main
import (
"github.com/zhemao/glisp/interpreter"
"errors"
"fmt"
)
// implementing factorial in Go to be used in GLISP
func FactorialFunction ( env * glisp . Glisp , name string ,
args [] glisp . Sexp ) ( glisp . Sexp , error ) {
if len ( args ) != 1 {
return glisp . SexpNull , glisp . WrongNargs
}
res := 1
var n int
switch t := args [ 0 ] . ( type ) {
case glisp . SexpInt :
n = int ( t )
default :
return glisp . SexpNull , errors . New ( "factorial argument must be integer" )
}
if n < 0 {
return glisp . SexpNull , errors . New ( "factorial argument must be positive" )
}
for i := 1 ; i <= n ; i ++ {
res *= i
}
return glisp . SexpInt ( res ), nil
}
// creating glisp environment and calling factorial function
func main () {
env := glisp . NewGlisp ()
env . AddFunction ( "factorial" , FactorialFunction )
res , _ := env . EvalString ( "(factorial 5)" )
switch t := res . ( type ) {
case glisp . SexpInt :
fmt . Printf ( "result is %d \n " , t )
}
}