Lisp / Scheme / Racket: Как определить функцию с помощью многоточия - PullRequest
1 голос
/ 09 февраля 2020

Я хочу определить функцию в Racket с неопределенным числом аргументов, поэтому я использую многоточие, но оно не работает:

(define (f x ...) (printf x ...))
(f "~a ~a" "foo" "bar")

Ошибка:

Arity mismatch

Как определить функцию в ракетке с многоточием?

1 Ответ

5 голосов
/ 09 февраля 2020

Существует две половины этого:

  1. принятие произвольного числа входных данных
  2. передача произвольного числа аргументов другой функции

To принять произвольное количество входных данных вместо ... после x, поставить один . перед x. Это объявляет x в качестве аргумента "rest", и аргументы будут собраны в список для x.

Пример:

> (define (f . x) x)
> (f "~a ~a" "foo" "bar")
(list "~a ~a" "foo" "bar")

Для передачи произвольного числа аргументов Вы можете использовать функцию apply, которая принимает список в качестве последнего аргумента.

Пример:

> (apply printf (list "~a ~a" "foo" "bar"))
foo bar

Объединение этих данных:

> (define (f . x) (apply printf x))
> (f "~a ~a" "foo" "bar")
foo bar
...