Skip to content

Let Over Macro (LOM)

Une macro dans Common Lisp est une vraie macro, entendons par là que le compilateur gén`ere le code qu’on lui demande de générer sans se poser de questions:

(defmacro print-random (i) 
                 `(let ((rr (random 10))) 
                       (format t "~A~%" (+ ,i rr))))

En plus d’être inutile, ce code en Common Lisp n’est pas correct, la variable rr peut être en conflit avec une autre variable dans contexte lexical ou cette macro est appelée. Une version correcte serait:

(defmacro print-random (i) 
                  (let ((rr (gensym))) 
                      `(let ((,rr (random 10))) 
                            (format t "~A~%" (+ ,i ,rr)))))

Ici, la variable rr est déclarée dans un champ lexical et associé à un nom unique généré par (gensym), elle est utilisée ensuite de la même façon que n’importe quelle variable passée en argument à la macro. Dans les faits, les deux versions de la macro vont fonctionner très bien, mais seule la seconde assure qu’il n’y aura pas d’effets secondaires.

Clojure est beaucoup plus stricte, il n’accepte pas l’utilisation de variables non déclarées dans ses macro et rend obligatoire l’utilisation de (gensym) dans un tel contexte. Ce qui peut poser problème lorsqu’on veut imbriquer deux macros qui utilisent la même variable.

Afin de simplifier l’utilisation de JDBC, je souhaite déclarer une macro (with-db & body) dans la quelle se trouve un environnement lexical qui me permette d’accéder directement à la base de données avec d’autres macros (fetch-db request) et (exec-db request).

(with-db (fetch-db ["select now()"]))

Le problème étant que le (with-open) utilisé par JDBC génère une variable lexicale qu’il faut reprendre dans les arguments de (jdbc/fetch) ou (jdbc/execute).

C’est ici qu’intervient le principe de LOM, ou Let Over Macro:

(let [cn (gensym)]
  (defmacro with-db [& body]
    `(with-open [~cn (jdbc/connection db)]
       ~@body))

  (defmacro exec-db [request]
    `(jdbc/execute ~cn ~request))

  (defmacro fetch-db [request]
    `(jdbc/fetch ~cn ~request)))

Le (let …) au lieu de se trouver à l’intérieur de la macro se trouve à l’extérieur, afin de créer un environnement lexical auquel toutes les macros peuvent accéder.

Le portable dans nos vies.

Notre compréhension du monde dépend directement de notre perception de la réalité. Dans le spectre lumineux seul, nos yeux ne perçoivent pas même 1% des ondes lumineuses que nous croisons tous les jours. Il en va de même de tous nos sens, nos oreilles ne captent qu’une fraction des ondes sonores qui nous entourent.

De cette perception très parcellaire de ce qui nous entoure, la plupart d’entres nous ont même renoncé et ne regardent même plus la réalité qu’au travers le prisme d’un écran minuscule qu’ils tiennent devant leurs yeux quasiment en permanence.

J’aime faire des photographies parce que cela me connecte au réel. Cela me force à observer, à être un témoin de mon époque. Cela me pousse à augmenter ma perception de la réalité et, par conséquent, ma compréhension du monde. Comme tout le monde, j’ai un portable, un iPhone SE que j’apprécie. Le soir, sa batterie est rarement à moins de 80% lorsque vient le temps de le charger. J’ai plus souvent épuisé la batterie de mon Nikon que celle de mon iPhone.

Intelligence artificielle et bêtise naturelle

Je viens de finir mon tour d’horizon de l’intelligence artificielle en suivant les cours de Franck Yu https://cs50.harvard.edu/ai/2023/ sur le sujet. J’en ai retenu au moins deux choses:

  • Je n’aime pas ça, l’idée qu’un ordinateur puisse faire des choix en fonction de critères qui échappent au commun des mortels est une idée qui me déplait fortement. Principalement parce que cela donne un pouvoir démesuré à une caste de technocrates qui sont à l’origine des critères de décision.
  • La seconde dépend directement de la première: l’intelligence artificielle n’existe pas. J’entends par là que le terme d’intelligence artificielle est trompeur, car il n’y a aucune intelligence derrière, mais juste une suite d’algorithmes et de paramètres que seule cette caste de technocrates comprend.

Lorsqu’un ordinateur joue aux échecs, il se contente de profiter de son énorme puissance de calcul pour estimer tous les coups possibles aussi loin que sa puissance le lui permet, d’en estimer une valeur en fonction de critères connus (nombre et placement des pièces), puis de choisir le coup qui compte le plus de points. Il n’y aucune stratégie, aucun instinct, aucune intelligence derrière les coups d’un ordinateur, juste des calculs dans une proportion qu’aucun cerveau humain ne peut égaler.

Mais celui qui apprend, me direz-vous. L’ordinateur se contente d’enregistrer les mouvements qu’il a joué et de leur attribuer une note selon qu’il ai gagné ou perdu la partie. Il n’a plus qu’à regarder dans cette base de données la valeur des mouvements avant de jouer.

L’humain lui n’a qu’une puissance de calcul dérisoire et une mémoire de poisson rouge à côté. Il joue avec des stratégies, de l’expérience, de l’instinct. Et pourtant, malgré l’inégalité des forces, il gagne encore contre la machine. C’est cela la vraie intelligence.

Je vous vois arriver avec les réseaux de neurones. Ils apprennent à lire, à analyser une image, même une vidéo. C’est vrai, mais là aussi, il n’y a aucune intelligence. Chaque neurone dispose d’un algorithme ou il multiplie des valeurs par des poids, puis rajoute un biais qu’il a estimé en fonction d’un algorithme tout aussi simple qu’il a utilisé lorsqu’on lui a donné des valeurs de référence.

Encore une fois, cela fonctionne grace `a la puissance de calcul incroyablement élevée d’un ordinateur et malgré cela, l’ordinateur fera toujours une analyse moins bonne qu’un être humain. Il se trompera en lisant des chiffres, verra quelque chose qui n’existe pas dans une photographie. Parce qu’il n’est pas intelligent, il se contente de comparer statistiquement des données en fonction d’autres données.