;;; Quelques exemples. -*- coding: utf-8 -*- ;;; D'abord quelques exemples sans subre syntaxique et ni récursion. ((+ 2) 3) ; ↝ 5 ((lambda (x) ((+ x) 1)) 7) ; ↝ ((+ 7) 1) ↝ 8 (let ((x 3)) ((+ x) 19)) ; ↝ ((+ 3) 19) ↝ 22 (let ((x ((cons 1) 2))) (car x)) ; ↝ (car ((cons 1) 2)) ↝ 1 ;;; Les exemples suivants utilisent tous du sucre syntaxique et/ou ;;; de la récursion. ;; Un exemple trivial pour commencer. (+ 1 2) ;; Un autre simple, mais avec les listes. (cons (car (cdr (cons 1 (cons 3 nil)))) 1415926) ;; Un exemple simple avec `let'. (let ((x 1)) (+ x 2)) ;; Un exemple moins simple avec `let'. (let ((+ 3) (- 4) (/ *)) (/ + -)) ;; L'exemple de la donnée. (let (((even x) (ifnil x 1 (odd (cdr x)))) ((odd x) (ifnil x 0 (even (cdr x))))) (odd (cons 0 (cons 0 (cons 0 nil))))) ;; Un exemple d'usage intense de fonctions d'ordre supérieur. (let ((orig-cons cons) ;Note la valeur initiale de `cons' et `nil': nous (orig-nil nil)) ;allons les redéfinir, mais on en aura encore besoin. (let (((identity x) x) ;; Les booléens. (true (lambda (x y) x)) (false (lambda (x y) y)) ((if x e1 e2) (x e1 e2)) ;; Les paires. ((pair x y) (lambda (i) (i x y))) ((fst x) (x true)) ((snd x) (x false)) ;; L'équivalent du type `Maybe a' de Haskell. ((just v) (lambda (n j) (j v))) (nothing (lambda (n j) n)) ((getmaybe x default) (x default identity)) ;; Définir les listes comme "List a = Maybe (a, List a)". ((cons x xs) (just (pair x xs))) (nil nothing) ((ifcons x then-branch else-branch) (x else-branch (lambda (v) (v then-branch)))) ((fold op i xs) (ifcons xs (lambda (x xs) (op x (fold op i xs))) i)) ((map f) (fold (lambda (x xs) (cons (f x) xs)) nil)) ;; Convertir les listes définies ci-dessus dans les listes ;; "natives" définies par le `cons' et `nil' prédéfini. (cons2list (fold orig-cons orig-nil)) (list (cons 1 (cons 2 (cons 3 (cons 4 nil)))))) (orig-cons (cons2list (map (lambda (x) (+ x 5)) list)) (fold + 0 list)))) ;; arch-tag: 924D444A-18D0-11D9-882E-000A95E675A6