;; !!! Limbajul trebuie să fie Pretty Big !!! ; ------------------Context computațional------------------ ;(define a 1) ;(define (f x) ; (+ x ; (let ((x 5)) ; (* a x)))) ;(f 2) ;(define a 2) ;(f 2) ;(define y 5) ;(letrec ((x y) (z 1)) ; x) ;(define (fact n) ; (if (zero? n) ; 1 ; (* n (fact (- n 1))))) ;(define g fact) ;(g 4) ; ;(define (fact n) n) ;(g 4) (define (g x) (* x x)) (define f (g 5)) ;f (define (g x) (* x x x)) ;f ; ------------------Grafuri infinite------------------ ; ------------------fără întârzierea evaluării------------------ ;(define g ; (letrec ((a (list 'a a b)) ; (b (list 'b b a))) ; a)) ; ------------------întârziere cu λ ()------------------ ;(define counter 0) ;(define g1 ; (letrec ((a (λ () ; (set! counter (add1 counter)) ; (list 'a a b))) ; (b (λ () (list 'b b a)))) ; (a))) ;counter ;g1 ;counter ;(define key first) ;(define (ls node) ((second node))) ;(define (rs node) ((third node))) ;(ls g1) ;(equal? g1 (ls g1)) ;(eq? g1 (ls g1)) ;counter ; ------------------întârziere cu delay------------------ ;(define c 0) ;(define g2 ; (letrec ((a (delay ; (set! c (add1 c)) ; (list 'a a b))) ; (b (delay (list 'b b a)))) ; (force a))) ;(define key first) ;(define (ls node) (force (second node))) ;(define (rs node) (force (third node))) ;g2 ;(equal? g2 (ls g2)) ;(eq? g2 (ls g2)) ;c ; ----------------Reevaluare promisiune------------- ;(define a 5) ;(define prom (delay (* a a))) ;(force prom) ;(set! a 7) ;(force prom) ; ------------------Utilizări------------------ (define (generate-room name) (lambda () ; închidere care împachetează acțiunea de a intra ; intrări diferite pot genera experiențe diferite (newline) (display "Ai intrat în ") (display name) (newline) (sleep 2) (cond ((< (random 100) 33) "Flashcards! Treci mai departe dacă rezolvi măcar jumătate.") ((< (random 100) 66) "O, nu, camera e invadată de efecte laterale! Elimină-le!") (else "Stack overflow! Găsește o soluție!")))) (define magic-chest (delay ; promisiune care amână deschiderea unui cufăr magic ; de oricâte ori deschidem cufărul, găsim aceeași superputere (begin (newline) (display "Capacul înțepenit se urnește greu") (sleep 2) (newline) (list-ref '("Transparență referențială" "Omnisciență temporară" "Continuation passing style") (random 3))))) ; Capturăm numele camerei pentru toate intrările ulterioare. (define secret-room (generate-room "Camera funcțională")) ;(secret-room) ;(secret-room) ;(secret-room) ;(secret-room) ;(force magic-chest) ;(force magic-chest) ;(force magic-chest) ;(force magic-chest)