Envelopper mon esprit autour de la notation des préfixes?


10

Je lis sur LISP.

Je comprends comment fonctionne la notation des préfixes à un certain niveau, mais je me demandais s'il y avait des astuces pour la rendre intuitive.


6
En dehors de la pratique, vous voulez dire?

L'utilisateur RPL est de loin ma saveur préférée de LISP. Il n'a même pas de parenthèses! en.wikipedia.org/wiki/RPL_(programming_language) Mon HP 50g me manque :-(
Robbie

Au début, cela ne semblait pas intuitif, mais maintenant je pense que c'est merveilleux, et j'ai surtout fait de la lecture. C'est en fait ainsi que nous parlons: "La somme de ..., le produit de ..." Cependant, cela nécessite une lecture différente. Maintenant, vous appliquez simplement l'opérateur à tous les arguments, au lieu de les lire sur une ligne.
Mark C

Quel est le problème avec la notation de préfixe? Presque toutes les langues l'utilisent. Les appels de fonction sont presque toujours préfixés.
SK-logic

Pas vraiment; "intuitif" est intuitif parce que vous l'avez appris sous forme de conventions mathématiques pendant plus de 20 ans. Étant donné que seul LISP et peut-être quelques autres langues utilisent cette convention, et que vous apprendrez encore beaucoup plus l'autre, elle ne deviendra presque jamais aussi "intuitive". Et nous ne parlons ici que d'expressions simples (2 + 3 ... comment aimeriez-vous essayer un liner "demi-page"? :)
Rook

Réponses:


6

Le lire mentalement de gauche à droite comme langue parlée avec les bons verbes peut aider. Par exemple (+ 3 2) pourrait être "ajouter trois et deux". Dans le cas plus général, vous pouvez dire "effectuer $ opération sur $ opérandes". Appliqué au même cas: "Effectuez l'opération d'ajout sur trois et deux".


Que feriez-vous avec ( = 1 2 )et( > 4 2 )
Vivian River

3
Vous utiliseriez des questions rhétoriques. :) Égal? (Quoi?), "1 et 2! (Euh ... Non ...)
Arafangion

@RiceFlour (Hé, j'ai grandi en mangeant des choses à base de farine de riz - j'ai un problème de gluten.) Je lirais "Est-ce qu'un est égal à deux?", Ou "Les éléments suivants sont-ils égaux?" Les opérateurs supérieur à et inférieur à ne sont pas si naturels sous forme de préfixe, mais je me demande à quelle fréquence ils sont utilisés dans le code Lisp.
Mark C

7

Des trucs? Pourquoi?

Cela ne vous semble pas encore intuitif, car votre analyseur mental n'y est pas habitué. Cela deviendra meilleur si vous l'utilisez et le lisez encore et encore.


Je n'ai même pas lu que beaucoup, mais maintenant je pense qu'il est merveilleux. Il semble que mon cerveau commence à avoir un sens presque "tactile" des parenthèses. Je pense que le sentiment ne fera que devenir plus vif.
Mark C

5

Vous pourriez y voir une sorte d'appel de fonction:

(operator operand1 operand2 ...)

Il n'y a rien de très spécial à ce sujet. Si vous surchargez des opérateurs en C ++ (et de nombreux autres langages qui le permettent), vous devez souvent définir ce type de fonction exactement de cette façon:

MyClass operator+(MyClass const& x, MyClass const& y);

Oui, c'est comme ça que je le fais. Si vous reculez et regardez les appels de méthode en Java, C #, etc., ils ne sont en fait que des préfixes avec les parenthèses dans un endroit légèrement différent: MyMethod (arg1, arg2).
nlawalker

4

De nombreuses langues utilisent un mélange de préfixe, d'infixe et même de postfixe.

Lisp utilise uniquement le préfixe - par défaut. Si sin (x) est intuitif par rapport aux mathématiques, alors (sin x) n'est pas loin. Si se déplacer (chien, maison) est un appel de procédure traditionnel, alors à Lisp c'est juste (déplacer le chien à la maison).

Lisp ne fait aucune exception pour les mathématiques et traite +, -, * et d'autres comme les appels de fonction ordinaires.


2

Lorsque (finalement) "Tout est un appel de fonction" (ou une forme spéciale, ou une macro-expansion, les deux ayant la syntaxe de surface de "l'appel de fonction") cliqué, cela semblait assez naturel.

Donc, car (= 1 2)je lis cela comme «appelez la comparaison numérique égale sur 1 et 2».

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.