sci_files Comment écrire des fonctions de conversion

## Description

Pour convertir les appels à des fonctions Matlab, `mfile2sci` utilise une fonctions appelée `sci_<nom_de_la_fonction_Matlab>`. Toutes ces fonctions sont définies dans des `sci_files` dans le répertoire SCI/modules/m2sci/macros/sci_files/. La palette de `sci_files` fournie dans Scilab ne permet pas encore de convertir les appels à toutes les fonctions Matlab. Cependant, un utilisateur Scilab peut ajouter des `sci_files` (pour des fonctions Matlab ou pour ses propres fonctions) en utilisant les conseils suivants.

Dans M2SCI, un appel à une fonction est considéré comme un "arbre" (c'est aussi le cas des instructions du fichier à convertir), représenté dans Scilab par une `tlist` avec les champs suivants :

- name

    nom de la fonction Matlab

  lhsnb

    nombre de paramètres de sortie de la fonction Matlab

  lhs

    liste des paramètres de sortie de la fonction Matlab

  rhs

    liste des paramètres d'entrée de la fonction Matlab

Une `sci_function` a un paramètre d'entrée `tree` qui est aussi la sortie de cette fonction. Une `sci_function` doit convertir cet arbre pour qu'il soit compatible avec Scilab en changeant name, lhsnb, lhs et/ou rhs. L'autre rôle de cette fonction est de gérer l'inférence. L'arbre d'entrée contient des données d'inférence dans ses rhs qui devront être mises à jour avec ce que l'on peut inférer pour les lhs de cette fonction.

Plusieurs fonctions ont été écrites pour aider à la rédaction de fonctions de conversion :

- Funcall

    créé un arbre qui représente l'appel à une fonction

  Operation

    créé un arbre qui représente une opération

  Variable

    créé un arbre qui représente une variable

  Cste

    créé un arbre qui représente une constante

  Infer

    créé un arbre qui représente les données d'inférence

  Type

    créé un arbre qui représente le type pour l'inférence

  Equal

    créé un arbre qui représente une instruction

Quelques fonctions ont été écrites pour récupèrer les propriétés des opérandes/entrées. En considérant A comme une tlist utilisée dans l'arbre, vous pouvez utiliser les fonctions suivantes :

La fonction | renvoie %T si...
is_empty(A) | toutes les dimensions de A sont égales à 0
not_empty(A) | toutes les dimensions de A sont connues et au moins une dimension de A est différente de 0
is_a_scalar(A) | toutes les dimensions de A sont égales 1
not_a_scalar(A) | toutes les dimensions de A sont connues et au moins une dimension de A est différente de 1
is_a_vector(A) | toutes les dimensions de A sotn connues et toutes les dimensions de A sauf une sont égales à 1
not_a_vector(A) | toutes les dimensions de A sotn connues et au moins deux dimensions de A sont supérieures à 1
is_real(A) | A est réel
is_complex(A) | A est complexe
isdefinedvar(A) | A est une variable déjà définie dans le M-file en cours de conversion
allunknown(A) | Toutes les dimensions de A sont inconnues

D'autres fonctions ont été écrites pour des besoins spécifiques lors de l'écriture de fonctions de conversion :

- first_non_singleton

    est équivalente à firstnonsingleton pour une tlist M2SCI. Séquence d'appel : dim = first_non_singleton(A)

  gettempvar

    génére une variable temporaire portant une nom qui n'existe pas. Séquence d'appel : v = gettempvar()

  insert

    permet d'insérer des instruction. Séquence d'appel : m2sci_insert(Equal(...),opt) avec opt~=1 pour insérer avan tl'instruction courante et opt=1 pour insérer après celle-ci.

  getoperands

    peut être utilisée pour extraire chaque opérande comme une variable. Séquence d'appel : [A,B] = getoperands(operation_tlist)

  getrhs

    peut être utilisée pour extraire chaque paramètre comme une variable. Séquence d'appel : [A,...] = getrhs(funcall_tlist)

  convert2double

    change le type de l'entrée quand ce type n'est pas implémenté pour une fonction particulière de Scilab. Séquence d'appel : A = convert2double(A)

Pour plus d'informations sur la façon d'écrire ces fichiers, consulter le répertoire SCI/modules/m2sci/macros/sci_files/ qui donne de nombreux exemples, des plus simples (e.g. sci_abs.sci) aux plus compliqués (e.g. sci_zeros.sci).

## Voir aussi

- m2scideclare
- Funcall
- Operation
- Variable
- Cste
- Infer
- Type
- Equal