Например ((fn-stringappend string-append) "a" "b" "c")
Я знаю, как обращаться с этим (f x y z)
. Но что, если есть неизвестное количество параметров? Есть ли способ справиться с такой проблемой?
Как обрабатывать неопределенное количество параметров в Схеме?
Ответ 1
В схеме вы можете использовать точечную нотацию для объявления процедуры, которая получает переменное количество аргументов (также называемое varargs или вариационная функция)
(define (procedure . args)
...)
Внутри procedure
, args
будет список с переданным нолем или более; назовите это так:
(procedure "a" "b" "c")
Как указано @Arafinwe, здесь эквивалентная нотация для анонимной процедуры:
(lambda args ...)
Назовите его следующим образом:
((lambda args ...) "a" "b" "c")
Помните, что если вам нужно передать параметры в списке неизвестного размера в вариационную функцию, вы можете написать это следующим образом:
(apply procedure '("a" "b" "c"))
(apply (lambda args ...) '("a" "b" "c"))
UPDATE:
Что касается кода в комментариях, это не будет работать так, как вы планируете:
(define (fp f)
(lambda (.z)
(f .z)))
Я полагаю, вы имели в виду это:
(define (fp f)
(lambda z
(apply f z)))
С небольшим количеством синтаксического сахара указанная выше процедура может быть еще более упрощена:
(define ((fp f) . z)
(apply f z))
Но это просто длинный путь для простого написания:
(apply f z)
Это то, что вам нужно?
(apply string-append '("a" "b" "c"))
Потому что в любом случае это эквивалентно следующему:
(string-append "a" "b" "c")
string-append
уже получает ноль или более аргументов (по крайней мере, в случае с Racket)
Ответ 2
В дополнение к ответу Óscar López вы также можете сделать анонимную функцию переменных аргументов следующим образом:
(lambda args ...)
Где снова внутри lambda
, args
- список переданных аргументов.