2010-11-16 1 views
12

Prenez cette fonction:Pourquoi un defun LISP n'a-t-il pas besoin d'un devis avant son argument de paramètre?

(defun sum-greater (x y z) 
(> (+ x y) z)) 

Je crois comprendre que LISP le premier élément dans une liste représente toujours une fonction à exécuter sur les atomes suivants/listes. Alors, pourquoi LISP ne traite pas le x dans (x y z) comme une fonction à effectuer sur y et z. Clairement ce ne serait pas un comportement souhaitable, mais ce serait le comportement attendu.

Vraisemblablement, la fonction qui définit defun annule d'une certaine manière l'évaluation LISP standard d'une liste? Si oui, pourriez-vous détailler cela?

Merci

+3

Il retarde aussi l'évaluation sur tous ses autres arguments: vous ne voulez évidemment pas que '(> ...)' soit évalué lorsque vous évaluez la forme 'defun', soit! – Ken

+0

Bon point, j'aurais dû reconnaître que le defun était plus qu'une simple fonction de ce seul. –

Répondre

8

IIRC en Common Lisp au moins defun est une macro (HyperSpec), ce qui signifie qu'il peut définir une stratégie d'évaluation que ce soit pour ses arguments.

+1

Ah oui, ça a du sens. Je n'ai pas encore atteint le chapitre macro de mon livre LISP. FYI - choisi cette réponse parce qu'elle est la plus concise, mais merci à tous. –

3

Votre présomption est correcte. Defun est généralement un special form ou macro

+1

dans Emacs Lisp, mais pas dans Common Lisp. Là c'est une macro. –

+2

J'ai modifié la réponse avant votre commentaire. Mais vous étiez tout à fait correct. –

6

defun est spécial parce que c'est une macro. Et puisque les macros peuvent dépendre de l'implémentation, toutes sortes de magie noire peuvent se produire sous le capot.

Lisp HyperSpec (Common Lisp) says, et je cite: "Aucun des arguments n'est évalué au moment de l'expansion de la macro".

3

Vous pouvez télécharger ici une introduction en Lisp:

Common Lisp: A Gentle Introduction to Symbolic Computation, by David S. Touretzky.

Lisp et surtout Common Lisp a plusieurs formes Lisp:

  • fonction appelle

  • appels macro

  • formes spéciales

DEFUN est une macro. Ainsi, la macro définit quelles parties sont évaluées et lesquelles ne le sont pas. Pour Lisp commun ANSI, ceci est défini dans la norme et implémenté par la macro DEFUN.

2

defun n'est pas une fonction, mais une forme spéciale (ou se résume à un), et pour ceux-ci, la mécanique d'évaluation est différente. Des exemples similaires seraient si, où l'un des arguments est même rejeté entièrement sans être évalué du tout!

Questions connexes