Domanda

Ansi Common Lisp. Perché ottengo un'altra risposta nell'ultimo caso?

(list 1 2 3 nil) ; (1 2 3 nil)
(funcall (function list) 1 2 3 nil) ; (1 2 3 nil)
(apply (function list) '(1 2 3 nil)) ; (1 2 3 nil)
(apply (function list) 1 2 3 nil) ; (1 2 3)
.

È stato utile?

Soluzione

APPLY si aspetta come argomenti:

    .
  • una funzione
  • zero ... n argomenti
  • E poi un elenco di argomenti alla fine

La funzione sarà fondamentalmente chiamata con il risultato di (list* 0-arg ... n-arg argument-list)

Nota che (list* '(1 2 3)) valuta solo (1 2 3).

Gli argomenti sono chiamati Elenco argomenti discutibili in comune lisp.

CL-USER 60 > (apply (function list) 1 2 3 nil)
(1 2 3)

CL-USER 61 > (apply (function list) (list* 1 2 3 nil))
(1 2 3)

CL-USER 62 > (apply (function list) (list* '(1 2 3)))
(1 2 3)
.

APPLY utilizza una tale lista di argomenti spalmabili per progettazione. Ad esempio (... 1 2 3 '(4 5)). Con FUNCALL devi scrivere gli argomenti come al solito: (... 1 2 3 4 5).

APPLY ha un unico scopo in comune lisp: consente di chiamare le funzioni con elenchi di argomenti calcolati. Per renderlo un po 'più conveniente, è stata utilizzata questa idea della lista degli argomenti diffusibili. Funziona lo stesso ad esempio in Emacs Lisp.

Immagina di avere un elenco di argomenti e vuoi aggiungere due argomenti davanti.

CL-USER 64 > (apply '+ args)
60

CL-USER 65 > (apply '+ 1 2 args)
63

CL-USER 66 > (apply '+ (append (list 1 2) args))
63
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top