Qu'est-ce que “pass-par nom” et comment ça fonctionne exactement?
J'ai vérifier wikipedia, et cherché sur google mais je n'ai pas encore envelopper mon esprit autour de comment passe-par-nom œuvres en ALGOL 60.
- vous pouvez penser à leur travail similaire à celui de la fonction en ligne en c++
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé une bonne explication à Passer-Par-Nom De Paramètre Passant. Essentiellement, le corps d'une fonction est interprété lors de l'appel de temps après textuellement la substitution de paramètres effectifs dans le corps de la fonction. En ce sens, la méthode d'évaluation est similaire à celle de préprocesseur C macros.
Par la substitution des paramètres effectifs dans le corps de la fonction, le corps de la fonction peut à la fois lire et écrire les paramètres donnés. En ce sens, la méthode d'évaluation est similaire à passé par référence. La différence, c'est que depuis avec passe-par-nom du paramètre est évalué l'intérieur de la fonction, d'un paramètre comme
a[i]
dépend de la valeur actuelle dei
l'intérieur de la fonction, plutôt que de se référer à la valeur aua[i]
avant que la fonction a été appelée.La page ci-dessus a d'autres exemples de cas où le passe-par-nom est à la fois utile et dangereux. Les techniques rendues possibles par le passe-par-nom sont largement dépassée aujourd'hui par d'autres techniques plus sûres telles que le passage par référence et les lambda fonctions.
#define f(x) x * 2
par opposition à#define f(x) ((x) * 2)
.) Et ALGOL permet à une fonction de prendre certains des arguments par valeur et certains par son nom, alors que tous les C macros prendre tous les arguments de la même façon.Je suis en supposant que vous voulez dire en appel par nom dans l'ALGOL 60.
En appel par le nom est semblable à la call-by-reference que vous pouvez modifier la valeur de la passé en paramètre. Elle diffère de la call-by-reference en ce que le paramètre est pas évaluée avant que la procédure est appelée, mais elle est plutôt évalué paresseusement. C'est, il est évalué quand et seulement quand le paramètre est en fait utilisé.
Par exemple, supposons que nous avons une procédure
f(x, y)
et nous le transmettrei
eti/2
oùi
est initialement égale à10
. Sif
jeux dex
à42
et évalue ensuitey
il va voir la valeur21
(alors qu'avec appel par la référence ou de l'appel par valeur, il serait encore voir5
). C'est parce que l'expressioni/2
n'est pas évaluée jusqu'ày
est évaluée.De plusieurs façons, cela semble se comporter comme un texte littéral de substitution de paramètres (avec le renommage pour éviter les conflits de nom). Dans la pratique, cependant, cela est mis en œuvre à l'aide de "bits" (en gros, fermetures) pour le passé dans les expressions.
L'article de Wikipédia sur Jensen Appareil montre quelques exemples intéressants de l'utilisation de l'appeler par son nom. Voici l'un d'eux:
Pour ceux dans l'avenir:
Notions dans les Langages de Programmation par
John C. Mitchell a également été utile.
En fait, appel par nom, n'est pas seulement une curiosité historique. Vous pouvez faire appel par nom dans Windows fichiers batch (et une myriade d'autres langages de script). De savoir comment il fonctionne et comment l'utiliser efficacement dans la programmation peut ouvrir soigné des solutions à des problèmes. Je sais qu'il est seulement de passage des cordes à travers pour plus tard de l'expansion, mais il peut être manipulé pour avoir des effets similaires en appel par nom.
Flatlander a un exemple révélateur de la façon dont il fonctionne dans la Scala ici. Supposons que vous vouliez mettre en œuvre tout:
Scala n'est pas Algol 60, mais peut-être qu'il jette un peu de lumière.
Vous pouvez passer "nom" dans la forme symbolique d'une variable qui lui permet d'être à la fois mis à jour et accessibles simultanément. Comme un exemple, disons que vous voulez triple d'une variable x, qui est de type int :
ALGOL a été conçu pour des algorithmes mathématiques. J'aime la somme fonctionner comme un exemple de l'appeler par son nom.
Désolé mon ALGOL est un peu rouillé, la syntaxe est probablement pas le droit.
Vous pourrait utiliser la somme de
Au-dessus de l'intérieure de la somme(y,3,8,x+y) permettrait de générer une fonction sans nom pour passer à l'extérieur de la somme d'appel. Les variables x et y ne sont pas passés par valeur, mais de nom. Dans le cas des variables appeler par son nom est l'équivalent de l'appel en fonction de l'adresse de référence en C. C'est un peu déroutant lorsque la récursivité est impliqué.
Emprunte fait ALGOL machines. Ils avaient 48 bits mot de la mémoire avec 3 drapeau bits. Le drapeau bits de mise en œuvre de la cal par nom d'ALGOL. c'était une pile de linge, afin que lorsque la fonction a été chargé sur la pile de les appeler par leur nom fag serait la cause d'être appelé. Le compilateur de générer sans nom fonctions lorsque expressions ont été utilisées comme arguments. Une variable qui serait une simple référence indirecte. Une erreur se produit l'écriture d'une fonction.
Je sais que je suis de rejoindre la fin pour le club et ce n'est pas nécessairement une réponse, mais je voulais ajouter une chose qui pourrait aider à éclaircir un peu. J'ai toujours pensé de l'Algol-passer-par-nom comme un processus semblable à quand le C++ directives de préprocesseur (macros, plus précisément) remplace le nom de la fonction/variable avec le morceau de code lors de la compilation. Le passe-par-nom remplace essentiellement le nom du paramètre formel avec le paramètre réel, et l'exécute. Je n'ai jamais écrit dans l'Algol, mais j'entends que se passe-par-nom aura le même résultat qu'en C++par référence.