Makes variadic arguments truly optional (you can pass zero of them)
This commit is contained in:
parent
4564de8a29
commit
1bf8fe8dce
23
helpers.go
23
helpers.go
|
@ -576,19 +576,18 @@ func stringParensMatch(s string) bool {
|
|||
return true
|
||||
}
|
||||
|
||||
func variadic(l expression) int {
|
||||
list, ok := l.([]expression)
|
||||
if !ok || len(list) == 0 {
|
||||
return 0
|
||||
func variadic(l []expression) int {
|
||||
args := len(l)
|
||||
variadic := false
|
||||
for _, v := range l {
|
||||
if arg, ok := v.(symbol); ok && (arg == symbol("args-list") || arg == symbol("...")) {
|
||||
variadic = true
|
||||
}
|
||||
if variadic {
|
||||
args -= 1
|
||||
}
|
||||
}
|
||||
v, ok := list[len(list)-1].(symbol)
|
||||
if !ok {
|
||||
return 0
|
||||
}
|
||||
if v == symbol("args-list") {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
return args
|
||||
}
|
||||
|
||||
func completeFromMap(m map[string]string, input string, index int) (c []string) {
|
||||
|
|
|
@ -446,7 +446,8 @@ func apply(procedure expression, args []expression) (value expression) {
|
|||
en := &env{make(vars), p.en}
|
||||
switch params := p.params.(type) {
|
||||
case []expression:
|
||||
if len(params)-variadic(params) > len(args) {
|
||||
fmt.Println(p)
|
||||
if variadic(params) > len(args) {
|
||||
return exception(fmt.Sprintf("Lambda expected %d arguments but received %d", len(params), len(args)))
|
||||
}
|
||||
for i, param := range params {
|
||||
|
|
Loading…
Reference in New Issue