7

Sto cercando qualcosa di simile a arguments gamma di Javascript:Come definire una funzione variadic

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

Sono consapevole della notazione per lunghezze di argomenti variabili e anche la funzione di sistema di apply.

Questo non sembra funzionare come il punto è considerato il primo argomento:

(define (parent .) 
      (list .)) 

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

Questo funziona, ma non è l'ideale. Mi piacerebbe chiamare la funzione, senza la sintassi in più per definire la lista 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) 

risposta

9

La sintassi corretta è:

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

usare in questo modo:

(parent 1 2 3 4 5) 

All'interno del procedimento, tutti gli argomenti sarà legato a un elenco di nome args-list. Nello snippet sopra riportato, args-list avrà il valore '(1 2 3 4 5). Questo è un esempio di come funzionano le funzioni variadic in Scheme.

Per ragioni di completezza, lo stesso meccanismo può essere utilizzato per le funzioni anonime, anche (notare che args-list è non circondato da parentesi):

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

desiderato:

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

Qual è infatti l'implementazione 'default' di list.

(define (list . x) x) 

Il messaggio di errore quando si applica (define (parent .) ...) sembra sbagliato, anche, il codice non avrebbe compilato, in primo luogo in quanto è una sintassi non valida. Potrebbe implicare un bug con la versione di Chicken Scheme che stai utilizzando.

Problemi correlati