lisp

package
v0.0.0-...-f699923 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 17, 2013 License: MIT Imports: 10 Imported by: 0

Documentation

Overview

簡単な Lisp インタープリタ. 数として有理数を扱う。

Index

Constants

This section is empty.

Variables

View Source
var AmpRestSymbol = NewSymbol("&rest")
View Source
var Globals = &Env{map[*Symbol]Any{
	TSymbol:          TSymbol,
	NewSymbol("car"): carFunc, NewSymbol("cdr"): cdrFunc,
	NewSymbol("cons"):  consFunc,
	NewSymbol("listp"): listpFunc, NewSymbol("eq"): eqFunc,
	NewSymbol("rplaca"): rplacaFunc, NewSymbol("rplacd"): rplacdFunc,
	NewSymbol("list"): listFunc,
	NewSymbol("="):    eqOp, NewSymbol("/="): neOp,
	NewSymbol("<"): ltOp, NewSymbol("<="): leOp,
	NewSymbol(">"): gtOp, NewSymbol(">="): geOp,
	NewSymbol("+"): addOp, NewSymbol("-"): subtractOp,
	NewSymbol("*"): multiplyOp, NewSymbol("/"): divideOp,
	NewSymbol("gensym"): gensymFunc,
	NewSymbol("print"):  printFunc,
	QuoteSymbol:         quoteForm,
	NewSymbol("setq"):   setqForm,
	NewSymbol("progn"):  prognForm, NewSymbol("if"): ifForm,
	NewSymbol("lambda"): lambdaForm, NewSymbol("let"): letForm,
	NewSymbol("defun"): defunForm,
	NewSymbol("apply"): applyForm, NewSymbol("and"): andForm,
	NewSymbol("future"): futureForm, NewSymbol("force"): forceFunc,
}, nil, sync.Mutex{}}

トップレベルの環境

View Source
var MaxPrintRecur = 4

StringFor 関数で同じリストを再帰的に表示する深さ

View Source
var NilSymbol = NewSymbol("nil")
View Source
var QuoteSymbol = NewSymbol("quote")
View Source
var TSymbol = NewSymbol("t")

Functions

func CheckArity

func CheckArity(arity int, a []Any)

引数の個数検査. 負数の arity は |arity| 個以上の引数を意味する。

func CheckForBinary

func CheckForBinary(x *Cell) (Any, Any)

長さ2のリストか確かめてその要素を返す。

func CheckForBinaryAndRest

func CheckForBinaryAndRest(x *Cell) (Any, Any, *Cell)

長さ2以上のリストか確かめてその要素を返す。

func CheckForUnaryAndRest

func CheckForUnaryAndRest(x *Cell) (Any, *Cell)

長さ1以上のリストか確かめてその要素を返す。

func NumberFor

func NumberFor(text string) (arith.Number, bool)

文字列に対する整数または有理数を得る。変換できないとき論理値に偽を返す。

func ReadAndEval

func ReadAndEval(line string) bool

文字列を読み込み式を評価する。 ただし,読み込んだ式が不完全ならば false を返して終わる。

func ReadAndEvalFile

func ReadAndEvalFile(fileName string) bool

ファイルを読み込み式を評価する。 ただし,読み込んだ式が不完全ならば false を返して終わる。

func ReadEvalPrint

func ReadEvalPrint(input io.Reader, output io.Writer) bool

入力を読み込み式を評価し結果を 元の式 => 結果の値 という形式で出力する。 ただし,読み込んだ式が不完全ならば false を返して終わる。

func StringFor

func StringFor(a Any) string

Lisp 式としての引数の文字列表現を返す。

Types

type Any

type Any interface{}

任意の型. 注意: 空リストは *Cell 型の nil (つまり Any 型の非 nil) で表現される。

func CheckForUnary

func CheckForUnary(x *Cell) Any

長さ1のリストか確かめてその要素を返す。

func LispBool

func LispBool(t bool) Any

真ならばシンボル t を,偽ならば空リストを返す。

type Cell

type Cell struct {
	Car Any
	Cdr *Cell // improper list にはしない
}

Cons セル型

func Cons

func Cons(car Any, cdr *Cell) *Cell

新しい cons セルを作る。

func (*Cell) String

func (cell *Cell) String() string

デバッグの便宜のための cons セルの文字列表現

type Env

type Env struct {
	Table map[*Symbol]Any
	Next  *Env
	Lock  sync.Mutex
}

環境. 現在の束縛変数に対する Table と自由変数に対する Next からなる。 Table を参照するときは Lock で排他すること。

func (*Env) Eval

func (env *Env) Eval(a Any) Any

与えられた環境のもとで引数を評価する。

func (*Env) Get

func (env *Env) Get(sym *Symbol) Any

シンボルに対する値を環境から得る。無ければパニックする。

func (*Env) Set

func (env *Env) Set(sym *Symbol, val Any)

シンボルに対する値を環境にセットする。 未定義のシンボルをトップレベル以外でセットするとパニックする。

type Future

type Future struct {
	Ch     <-chan Any
	Result Any
	Lock   sync.Mutex
}

type Lex

type Lex struct {
	scanner.Scanner
	Token rune // 現在のトークン
	Value Any  // 現在のトークンの値
}

字句解析器 (Lexical analyzer)

func NewLex

func NewLex(src io.Reader) *Lex

入力ソースに対する字句解析器を返す。

func (*Lex) NextToken

func (lex *Lex) NextToken()

次のトークンを lex.Token に得る。 識別子や数や文字列ならば値を lex.Value をセットする。 一般の記号類はすべて識別子扱いする。

func (*Lex) Panic

func (lex *Lex) Panic(msg string)

文脈情報を伴った error でパニックを発生させる。

func (*Lex) Read

func (lex *Lex) Read() Any

字句解析器を使ってパースし Lisp 式を返す。 空リストは *Cell 型の nil (つまり Any 型の非 nil) として返す。 EOF ならば Any 型の nil を返す。

type Symbol

type Symbol struct {
	// contains filtered or unexported fields
}

シンボル型. 同じ文字列に対してアドレスは常に一意。

func NewSymbol

func NewSymbol(name string) *Symbol

文字列からシンボルを作る。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL