Как я могу определить функцию, используя неизвестное количество переменных? - PullRequest
1 голос
/ 28 октября 2019

Я изучаю Lisp впервые и работаю над простой функцией, которая добавляет два списка. Когда я тестировал функции предопределенного append, я заметил, что могу дать ему более двух списков, и я подумал, как сделать это самому? Поэтому мне интересно, как сделать функцию в Лиспе, которая принимает неизвестное количество переменных?

Ответы [ 2 ]

3 голосов
/ 28 октября 2019

Вы можете определить функцию, используя пунктирный список для необязательных аргументов. Все необязательные аргументы будут переданы вашей функции в виде списка.

Так, например, эта функция принимает один обязательный аргумент a0 и любое количество необязательных аргументов, передаваемых в виде a-rest list:

(define (take-many a0 . a-rest)
  a-rest)

Теперь, когда вы вызываете его:

(take-many 1 20 333)

=> (20 333)

, вы можете видеть, что необязательный аргумент second и thind доступен в виде списка. Для доступа к ним вы используете стандартные средства доступа к спискам, такие как car, cdr, nth и т. Д.

То же самое относится и к lambda.

Подробнее об этом можно прочитать на Доктор Ракет: 3.8. Выражения процедур: лямбда и лямбда-кейс (ищите rest-id).

2 голосов
/ 28 октября 2019

Используйте &rest лямбда-список ключевое слово:

(defun test-rest (a &rest b)
  (format t "1st argument: ~S; 2nd argument: ~S; other arguments: ~S~%"
          a (first b) (rest b)))

Сейчас (test-rest 1 2 3 4) печатает

1-й аргумент:1;2-й аргумент: 2;другие аргументы: (3 4)

Если вас особенно интересует Схема, вы можете использовать пунктирный арглист:

(define (test-rest a . b) 
  (display (list (list "first" a) 
                 (list "others" b))))

Теперь (test-rest 1 2 3 4) выведет

((первая 1) (остальные (2 3 4)))

...