Я думаю, что вы действительно спрашиваете, как создать функцию variadi c в Scheme / Racket. Ответ дается на https://docs.racket-lang.org/guide/define.html, но позвольте мне привести вам краткий пример:
(define (foo a b . xs)
(+ a b (length xs)))
будет эквивалентно
def foo(a, b, *xs):
return a + b + len(xs)
в Python. xs
здесь это значение списка, содержащее остальные аргументы.
Второй кусок головоломки - как применить функцию variadi c со значением списка. Для этого вы можете использовать apply
. Узнайте больше на https://docs.racket-lang.org/guide/application.html#% 28part._apply% 29 . Опять же, вот краткий пример:
(define (foo a b c) (+ a b c))
(apply foo 1 '(2 3))
;; equivalent to (foo 1 2 3)
будет эквивалентно
def foo(a, b, c): return a + b + c
foo(1, *[2, 3]) ;; equivalent to foo(1, 2, 3)
С этим создание сгиба, который принимает несколько аргументов, является всего лишь упражнением в программировании:
(define (my-fold proc accum required-first-list . list-of-optional-lists)
... IMPLEMENT FOLD HERE ...)
Обратите внимание, что если вы прочитаете исходный код Racket (который использует схему Chez), вы увидите, что он использует case-lambda
вместо непосредственного определения функции. case-lambda
- это просто способ сделать код более эффективным для обычного использования свертывания (т. Е. Сворачивания только с одним списком).