7

ich für etwas Ähnliches suchen bin zu arguments Arrays Javascript:Wie man eine variadische Funktion definieren

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

Ich bin mir bewusst, der Punktnotation für variable Argument Längen und auch apply Funktion Schema.

Dies scheint nicht so der Punkt das erste Argument zu sein, genommen zu arbeiten:

(define (parent .) 
      (list .)) 

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

Das funktioniert aber nicht ideal. Ich möchte die Funktion ohne die zusätzliche Syntax rufen Sie die args Liste zu definieren:

(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) 

Antwort

9

Die korrekte Syntax ist:

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

es wie folgt verwendet:

(parent 1 2 3 4 5) 

Innerhalb des Verfahrens, alle Argumente werden auf eine Liste args-list Namen gebunden. Im obigen Codefragment wird args-list als Wert '(1 2 3 4 5) haben. Dies ist ein Beispiel dafür, wie variadische Funktionen in Scheme funktionieren.

Aus Gründen der Vollständigkeit kann der gleiche Mechanismus für anonyme Funktionen verwendet werden, auch (beachten Sie, dass args-listnicht ist von Klammern umgeben ist):

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

Sie wollen:

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

Welche infact die 'default' Implementierung von list ist.

(define (list . x) x) 

Die Fehlermeldung, wenn (define (parent .) ...) Anwendung scheint falsch, auch, sollte der Code nicht in erster Linie zusammengestellt hat, da es ungültige Syntax ist. Könnte einen Fehler mit der Version von Chicken Scheme implizieren, die Sie verwenden.

Verwandte Themen