Kink

Résumé

Kink est un langage de la grande fammile des LISPs. Celui-ci a la particulariité d'être à évaluation parreseuse et d'avoir un environnement à portée statique. On a aussi la possibilité de choisir la langue des messages d'erreurs.

Table des matières

1. Introduction

Kink est un Lisp. Il a été réalisé pour l'UV «implémentation de micro langage». Il se veut minimaliste et propre du point de vue fonctionnel. Il ne possède donc pas de fonction à effet de bord comme set! ou setq.

2. Installation

2.1. Compilation

Dans la plupart des cas, il suffit de taper la séquence suivante: ./configure make make install

Néanmoins, il se peut que dans certain cela ne soit pas suffisant. Alors, si vous voulez changer le répertoire d'installation, tapez: ./configure --prefix=Mon répertoire

Si cela ne convient toujours pas, lisez le fichier INSTALL ou tapez: ./configure --help

2.2. Internationalisation

Par défaut, la langue de kink est l'anglais. Si vous voulez un autre langue (seulement le français pour l'instant), il vous faut compiler kink avec la librairie gettext. C'est ce qui est fait par défaut. Si vous n'avez pas installé gettext, vous pouvez utiliser l'option suivante: configure --with-included-gettext ou bien si vous ne voulez pas l'internationalisation essayez: configure --disable-nls Ensuite, il faut installer le programme. Pour cela, allez voir à la section suivante.

Un fois que tout est installé, il faut choisir sa langue. On fait cela en modifiant la variable d'environnement LANG: export LANG=fr

Voilà, kink parle français maintenant.

3. Liste des fonctions

3.1. Primitives essentielles

(lambda (formal) body)
Evalue le corps de lambda dans l'environnement de sa première evaluation étendu par les arguments. Si lors de l'évaluation un des paramètres formels est rencontré et si c'est la première fois qu'on le rencontre alors ce dernier est évalué dans l'environnement d'appel, sinon on prend la valeur de sa dernière évaluation. Le résultat de cette évaluation remplace l'ancienne valeur du paramètre.

(define a (lambda (a) (+ a 1))) (a (a 1)) => 3

(define symbol body)
Associe body au symbole symbol dans l'environnement courant.

body n'est pas évaluer. define retourne le symbol

(quote expr)
(' expr)
Retourne expr sans l'évaluer
(if condition expr-t expr-f)
Evalue la condition. Si celle-ci renvoie #f alors on evalue expr-f sinon on évalue expr-t

3.2. Fonctions sur les listes

(cons atom list)
Construit la liste list avec le atom comme premier element.
(car list)
Retourne le premier element de list
(cdr list)
Retourne la liste list sans le premier element
(null? list)
Retourne #t si list est vide; sinon retourne #f
(scons atom list)
Construit un flux.

3.3. Fonctions arithmétiques

3.3.1. Calcul

(+ a b)
Additionne deux nombres
(- a b)
Soustrait deux nombres
(* a b)
Multiplie deux nombres
(/ a b)
Divise deux nombres. (a / b)

3.3.2. Prédicats

(= a b)
Renvoie #t si a et b on la même valeur, sinon renvoie #f

3.4. Fonctions diverses

(quit)
Sort du programme
(version)
Affiche la version courante de Kink

4. Performances et limites

Il faut que j'améliore les points suivants:

4.1. Bugs connus

Parser
les espaces en début de ligne ne sont pas éliminés
parser
l'opérateur «-» est considéré comme l'entier «-0»
cons
Parcours de scons récursif très incertain

5. Conclusion

Cet évaluateur est loin d'être terminé. Notement, je compte lui rajouter un système de bibliothèque dynamique de primitive. De plus, Kink peut relativement facilement être parallélisé.