Правильный синтаксис для лямбда-выражения, которое получает любое количество аргументов в схеме - PullRequest
10 голосов
/ 16 февраля 2011

В схеме вы можете определить следующую процедуру:

(define (proc . vars)
        (display (length vars)))

Это позволит вам отправлять любое количество аргументов в proc.Но когда я пытаюсь сделать это следующим образом:

(define proc (lambda (. vars)
        (display (length vars))))

я получаю следующую ошибку:

read: незаконное использование "."

Я не могу найти правильный синтаксис для лямбда-выражения, которое получает любое количество аргументов.Идеи?

(я использую DrScheme, версия 209, с языком, установленным на PLT (графический))

Спасибо!

Ответы [ 3 ]

15 голосов
/ 16 февраля 2011

Первый аргумент lambda - это список аргументов:

(define proc (lambda vars
    (display (length vars))))

(proc 1 2 4) ; 3
(proc) ; 0
6 голосов
/ 16 февраля 2011

Ключевым моментом для понимания синтаксиса (lambda args ...) (который уже опубликованы другими авторами) является то, что одинокий элемент, не включенный в список (в данном случае args), является вырожденным неправильным списком.Пример:

(define a '(arg1 arg2 . rest))
a                   ; => (arg1 arg2 . rest) (improper list of length 2)
(cdr a)             ; => (arg2 . rest)      (improper list of length 1)
(cdr (cdr a))       ; => rest               (improper list of length 0)
1 голос
/ 16 февраля 2011

Вы должны опустить скобки в списке аргументов лямбды, чтобы обозначить переменное число аргументов:

(define proc (lambda vars
    (display (length vars))))
...