;; ATENȚIE! ;; Pentru a rula aceste exemple, alegeți Language/Other languages/Pretty Big ;; Ne implementăm propriile primitive într-un ;; limbaj de programare fictiv "lambda-0", ;; folosind doar Calcul Lambda. ;; Wow! ;; true e o funcție binară care întoarce mereu primul argument ;; false ... pe al doilea (define true-0 (λ (x y) x)) (define false-0 (λ (x y) y)) ;; not(T) = F not(F) = T (define not-0 (λ (x) (x false-0 true-0))) ;(map not-0 (list true-0 false-0 false-0)) ;; and(T, y) = y and(F, y) = F (define and-0 (λ (x y) (x y false-0))) ;; or(T, y) = T or (F, y) = y (define or-0 (λ (x y) (x true-0 y))) ;; if(T, x, y) = x if(F, x, y) = y (define-syntax if-0 (syntax-rules () ( (_ pred true-exp false-exp) ;; artificiu pentru ca if să fie nestrictă ((pred (λ () true-exp) (λ () false-exp)))))) (define cons-0 (λ (x y) (λ (z) (z x y)))) ;; car(cons(x,y)) = x (define car-0 (λ (L) (L true-0))) ;; cdr(cons(x,y)) = y (define cdr-0 (λ (L) (L false-0))) (define null-0 (λ (x) true-0)) ;; null?(null) = T ;; null?(cons(x,y)) = F (define null-0? (λ (L) (L (λ (x y) false-0)))) (define (append-0 A B) (if-0 (null-0? A) B (cons-0 (car-0 A) (append-0 (cdr-0 A) B)))) ; facem conversia în liste standard ; doar pentru vizualizare (define (list-0->std L) (if-0 (null-0? L) '() (cons (car-0 L) (list-0->std (cdr-0 L))))) (append-0 (cons-0 'a (cons-0 'x null-0)) (cons-0 'y (cons-0 'z null-0))) (list-0->std (append-0 (cons-0 'a (cons-0 'x null-0)) (cons-0 'y (cons-0 'z null-0)))) (define zero-0 null-0) (define (succ-0 n) (cons-0 'x n)) (define pred-0 cdr-0) (define zero-0? null-0?) (define (take-0 L n) (if-0 (or-0 (null-0? L) (zero-0? n)) null-0 (cons-0 (car-0 L) (take-0 (cdr-0 L) (pred-0 n))))) (list-0->std (take-0 (cons-0 'x (cons-0 'y (cons-0 'z (cons-0 't null-0)))) (succ-0 (succ-0 (succ-0 zero-0))))) (list-0->std (take-0 (cons-0 'x (cons-0 'y (cons-0 'z (cons-0 't null-0)))) (succ-0 (succ-0 (succ-0 (succ-0 (succ-0 zero-0)))))))