Подтвердить что ты не робот

Как обрабатывать неопределенное количество параметров в Схеме?

Например ((fn-stringappend string-append) "a" "b" "c") Я знаю, как обращаться с этим (f x y z). Но что, если есть неизвестное количество параметров? Есть ли способ справиться с такой проблемой?

4b9b3361

Ответ 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 - список переданных аргументов.