7

szukam czegoś podobnego do arguments tablicy JavaScript za:Jak zdefiniować zmiennej liczbie argumentów funkcji

function parent(){ 
    child.apply(this.arguments); 
} 

Jestem świadomy notacji dot dla zmiennej długości argumentów, a także apply funkcji w schemacie.

nie wydają się działać jak kropka przyjmuje się jako pierwszy argument:

(define (parent .) 
      (list .)) 

(parent 1 3 4 6 7) 
Error: bad argument count - received 5 but expected 1: #<procedure (array arg-list)> 

To działa, ale nie jest idealny. Chciałbym wywołać funkcję bez dodatkowej składni zdefiniować listę args:

(define (parent args-list) 
    (apply list args-list)) 


(parent 1 3 4 6 7) 
Error: bad argument count - received 5 but expected 1: #<procedure (array args-list)> 

(parent `(1 3 4 6 7)) 
(1 3 4 6 7) 

Odpowiedz

9

Poprawna składnia jest następująca:

(define (parent . args-list) 
    <do something with args-list>) 

Używaj go tak:

(parent 1 2 3 4 5) 

Wewnątrz procedury, wszystkie argumenty będą zobowiązane do listy o nazwie args-list. W powyższym fragmencie numer args-list będzie mieć wartość '(1 2 3 4 5). Jest to przykład działania funkcji variadycznych w Schemacie.

Dla kompletności, ten sam mechanizm można wykorzystać do funkcji anonimowych, zbyt (zauważ, że args-list jest nie otoczony nawiasach):

((lambda args-list <do something with args-list>) 1 2 3 4 5) 
3

Chcecie:

(define (parent . args) 
    args) ; args is a list 

Który jest rzeczywiście „default” realizacja list.

(define (list . x) x) 

Komunikat o błędzie podczas stosowania (define (parent .) ...) wydaje się złe, też, kod nie powinien prowadzić w pierwszej kolejności, ponieważ jest nieprawidłowa składnia. Może sugerować błąd w wersji programu Chicken Scheme, którego używasz.

Powiązane problemy