---
title: "Récupération de données" 
weight: 1
---

# Récupération de données

Dans cette section sont décrites des techniques exploitant les mécanismes de la
résolution stellaire afin de réaliser des opérations souhaitables pour un
programmeur.

## Retour d'interaction

Les rayons non polarisés ou *neutres* ne peuvent pas interagir mais se
retrouvent en résultat de l'exécution. Il sont donc utilisés pour récupérer des
informations sur le calcul effectué.

On peut les utiliser pour suivre les interactions effectives avec des sortes de
messages de debug. Par exemple, si on a cette constellation calculant pour
quelles valeurs la formule `X /\ ~(Y \/ Z)` est vraie :

```
+not(0 1); +not(1 0);
+and(0 0 0); +and(0 1 0); +and(1 0 0); +and(1 1 1);
+or(0 0 0); +or(0 1 1); +or(1 0 1); +or(1 1 1);

' X /\ ~(Y \/ Z)
@-or(Y Z R1) -not(R1 R2) -and(X R2 1) x(X) y(Y) z(Z);
```

On pourrait ajouter un rayon neutre pour vérifier quel calcul a été effectué
pour le connecteur `not` :

```
+not(0 1) debug(not(0 1)); +not(1 0) debug(not(1 0));
+and(0 0 0); +and(0 1 0); +and(1 0 0); +and(1 1 1);
+or(0 0 0); +or(0 1 1); +or(1 0 1); +or(1 1 1);

' X /\ ~(Y \/ Z)
@-or(Y Z R1) -not(R1 R2) -and(X R2 1) x(X) y(Y) z(Z);
```

## Redirection

Il est aussi possible d'utiliser des rayons polarisés afin de déléguer
le transfert de message à une autre constellation dédiée :

```
+not(0 1) +debug(0 1); +not(1 0) +debug(1 0);
+and(0 0 0); +and(0 1 0); +and(1 0 0); +and(1 1 1);
+or(0 0 0); +or(0 1 1); +or(1 0 1); +or(1 1 1);

' debug
-debug(X R) debug(not(X R));

' X /\ ~(Y \/ Z)
@-or(Y Z R1) -not(R1 R2) -and(X R2 1) x(X) y(Y) z(Z);
```

Cela permet en particulier un traitement générique.

## Langage naturel

En utilisant des constantes, il est possible de mimer le langage naturel, chose
très pratique pour l'affichage de résultats :

```
message(hello world);
```

Cette astuce utilise le fait que les constantes sont ordonnées lorsqu'elles
sont en arguments d'un symbole de fonction.

## Interpolation de chaîne

En rajoutant des variables, il est en fait possible d'afficher des messages
génériques :

```
+not(0 1) +debug(0 1); +not(1 0) +debug(1 0);
+and(0 0 0); +and(0 1 0); +and(1 0 0); +and(1 1 1);
+or(0 0 0); +or(0 1 1); +or(1 0 1); +or(1 1 1);

' debug
-debug(X R) debug(the result of not(X) is R);

' X /\ ~(Y \/ Z)
@-or(Y Z R1) -not(R1 R2) -and(X R2 1) x(X) y(Y) z(Z);
```