web-dev-qa-db-fra.com

Évaluation normale des commandes -Ves- Évaluation d'ordre applicatif

Je passe par Abelson et Sussman (- structure et interprétation des programmes informatiques ) et je suis un peu confus que lorsque l'évaluation normale des commandes est utilisée et lorsque l'évaluation de l'ordre applicatif est utilisée.

Cette phrase me jette:

LISP utilise une évaluation de commande applicatif Partiellement en raison de l'efficacité supplémentaire obtenue d'éviter les multiples évaluations des expressions Suich que celles illustrées avec (+5 1) et (* 5 2) ci-dessus et, plus significativement, parce que l'évaluation normale de commande devient beaucoup plus compliquée à traiter lorsque nous quittons le domaine des procédures pouvant être modélisées par substitution. [emphase ajoutée]

sur page 17 .

Cependant, dans l'exercice 1.6, l'implication est que LISP utilise une évaluation normale des ordres pour les primitives, mais une évaluation d'ordre applicatif pour des procédures complexes.

Quelqu'un pourrait-il clarifier?

7
Jonathan Henson

Premièrement: il existe de multiples implémentations de LISP, chacune peut avoir des modèles d'évaluation différents. Je crois que SICP utilise principalement le système.

Exercice 1.6 non implique que le régime utilise un ordre normal - il s'agit d'un formulaire spécial (if). Pour des formulaires spéciaux, l'évaluation ne peut être ni applicative ni normale.

Je pense que le schéma utilise toujours l'ordre applicatif sauf dans le cas de formes spéciales.

Par example:

(cond (x 1)
      (y 2)
      (else 3))

cond est une forme spéciale. Cela évaluerait en évaluant x, et s'il est vrai, returnez 1, sinon évaluez y, renvoyant 2 s'il est vrai, autrement renvoyé 3.


Je suis un peu rouillé sur le schéma - j'espère que je n'ai pas oublié de parenthèses! Je suis également conscient qu'il existe de multiples versions de schéma, mais je ne sais pas lequel est utilisé par le livre.

7
user39685

parce que l'évaluation normale des commandes devient beaucoup plus compliquée à traiter lorsque nous quittons le domaine des procédures pouvant être modélisées par substitution.

Mettre cela différemment, considérez

let x = (print "ha", print "ho") in x

La question est que cette impression a) rien, b) ha c) ho d) haho?

Est-ce que cela ne fait que la première fois, ou chaque fois que X est utilisé?

Avec une évaluation normale des commandes, cela dépendrait de la quantité de l'expression demandée, comme:

y = fst x

C'est une des raisons pour lesquelles des langues non strictes (c'est-à-dire à l'aide d'une forme d'évaluation normale de commande qui Can être modélisée par substitution) ont tendance à être pur, c'est-à-dire des effets secondaires dans les expressions ne sont pas autorisés.

0
Ingo