Makes variadic arguments truly optional (you can pass zero of them)

This commit is contained in:
sloum 2022-05-30 22:13:38 -07:00
parent 4564de8a29
commit 1bf8fe8dce
3 changed files with 14 additions and 14 deletions

View File

@ -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) {

View File

@ -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 {

View File

@ -16,7 +16,7 @@ import (
ln "github.com/peterh/liner"
)
const version = "0.6.4"
const version = "0.7.0"
const globalLibPath = "/usr/local/lib/slope/modules/"