コード例 #1
0
ファイル: add.go プロジェクト: luoxing91/goLisp
func (self *Mod) Apply(args []value.Value) value.Value {
	if len(args) != 2 {
		panic(fmt.Sprint("argument mismatch for `%', expected 2, given: ", len(args)))
	}
	if v1, ok := args[0].(*value.IntValue); ok {
		if v2, ok := args[1].(*value.IntValue); ok {
			if v2.Value == 0 {
				panic(fmt.Sprint("remainder: undefined for 0"))
			}
			return value.NewIntValue(v1.Value % v2.Value)
		}
	}
	panic(fmt.Sprint("incorrect argument type for `%', expected integer?"))
}
コード例 #2
0
ファイル: add.go プロジェクト: luoxing91/goLisp
func (self *Mult) Apply(args []value.Value) value.Value {
	var val1 int64 = 1
	var val2 float64 = 1
	isfloat := false

	for _, arg := range args {
		switch arg.(type) {
		case *value.IntValue:
			val1 *= arg.(*value.IntValue).Value
		case *value.FloatValue:
			isfloat = true
			val2 *= arg.(*value.FloatValue).Value
		default:
			panic(fmt.Sprint("incorrect argument type for '*' : ", arg))
		}
	}
	if !isfloat {
		return value.NewIntValue(val1)
	} else {
		return value.NewFloatValue(float64(val1) * val2)
	}
}
コード例 #3
0
ファイル: add.go プロジェクト: luoxing91/goLisp
func (self *Sub) Apply(args []value.Value) value.Value {
	var val float64
	isfloat := false

	if len(args) == 0 {
		panic(fmt.Sprint("`-' argument unmatch: expected at least 1"))
	} else if len(args) > 1 {
		switch args[0].(type) {
		case *value.IntValue:
			val = float64(args[0].(*value.IntValue).Value)
		case *value.FloatValue:
			val = args[0].(*value.FloatValue).Value
		default:
			panic(fmt.Sprint("incorrect argument type for `-' : ", args[0]))
		}
		args = args[1:]
	}

	for _, arg := range args {
		switch arg.(type) {
		case *value.IntValue:
			val -= float64(arg.(*value.IntValue).Value)
		case *value.FloatValue:
			isfloat = true
			val -= arg.(*value.FloatValue).Value
		default:
			panic(fmt.Sprint("incorrect argument type for `-' : ", arg))
		}

	}
	if isfloat {
		return value.NewFloatValue(val)
	} else {
		return value.NewIntValue(int64(val))
	}
}
コード例 #4
0
ファイル: string.go プロジェクト: luoxing91/goLisp
func (self *Int) Eval(env *scope.Scope) value.Value {
	return value.NewIntValue(self.Value)
}