#lang plai ;; YESTERDAY ;; - The Web is programming without an automatic stack ;; - A stack is control + data ;; TODAY ;; - Closures are control + data [0:07] ;; -- convert add-two-numbers.com [0:14] ;; - add-many-numbers.exe [0:25] ;; - add-many-numbers.com [0:35] ;; -- remove closures [0:40] ;; - What is Web style? ;; -- order of evalaution & sequential ;; -- global ;; -- no-closures [0:50] ;; CONSOLE (define (prompt text) (displayln text) (read)) (define (add-two-numbers.exe) (displayln (+ (prompt "First number:") (prompt "Second number:")))) ;; WEB (define (web-prompt text whose-next more) (web-displayln text whose-next more)) (define (web-displayln text whose-next more) (printf "\n~a\n" more text) (whose-next (read) more) (error 'http "I'm stateless")) (define (add-two-numbers.com) (web-prompt "First number:" add-two-numbers.com/first.cgi #f)) (define (add-two-numbers.com/first.cgi first-number junk) (web-prompt "Second number:" add-two-numbers.com/second.cgi first-number)) (define (add-two-numbers.com/second.cgi second-number first-number) (web-displayln (+ first-number second-number) void #f)) ;;(add-two-numbers.com) ;; WEB w/ closures (define (web-prompt/clo text next-clo) (web-displayln/clo text next-clo)) (define (web-displayln/clo text next-clo) (printf "\n~a\n" next-clo text) (next-clo (read)) (error 'http "I'm stateless")) (define (add-two-numbers.com/clo) (web-prompt/clo "First number:" (λ (first-number) (web-prompt/clo "Second number:" (λ (second-number) (web-displayln/clo (+ first-number second-number) void)))))) ;; (add-two-numbers.com/clo) (define (sum l) (foldr + 0 l)) (define (build-list n f) (cond [(zero? n) empty] [else ;; We are returning here (define rest (build-list (sub1 n) f)) ;; We are returning here (cons (f n) rest)])) (define (add-many-numbers.exe) (define how-many ;; We are returning here (prompt "How many numbers?")) (displayln (format "The sum of your ~a numbers is: ~a" how-many (sum ;; We are returning here (build-list how-many (λ (i) ;; We are returning here (prompt (format "~a# number:" i)))))))) ;; (add-many-numbers.exe) (define (web-build-list/clo n web-f clo) (cond [(zero? n) (clo empty)] [else (web-build-list/clo (sub1 n) web-f (λ (rest) (web-f n (λ (first) (clo (cons first rest))))))])) (define (add-many-numbers.com/clo) (web-prompt/clo "How many numbers?" (λ (how-many) (web-build-list/clo how-many (λ (i clo) (web-prompt/clo (format "~a# number:" i) clo)) (λ (the-numbers) (web-displayln/clo (format "The sum of your ~a numbers is: ~a" how-many (sum the-numbers)) void)))))) ;; (add-many-numbers.com/clo) (define (web-build-list n web-f next next-data) (cond [(zero? n) (next empty next-data)] [else (web-build-list (sub1 n) web-f web-build-list/got-rest.cgi (list web-f n next next-data))])) (define (web-build-list/got-rest.cgi rest data) (match-define (list web-f n next next-data) data) (web-f n web-build-list/got-one.cgi (list rest next next-data))) (define (web-build-list/got-one.cgi first data) (match-define (list rest next next-data) data) (next (cons first rest) next-data)) (define (add-many-numbers.com) (web-prompt "How many numbers?" add-many-numbers.com/how-many.cgi #f)) (define (add-many-numbers.com/how-many.cgi how-many junk) (web-build-list how-many add-many-numbers.com/get-one.cgi add-many-numbers.com/got-numbers.cgi how-many)) (define (add-many-numbers.com/get-one.cgi i next next-data) (web-prompt (format "~a# number:" i) next next-data)) (define (add-many-numbers.com/got-numbers.cgi the-numbers how-many) (web-displayln (format "The sum of your ~a numbers is: ~a" how-many (sum the-numbers)) void #f)) (add-many-numbers.com) ;; (... waiting for ans ... (f arg ...)) ;; -> ;; (f/clo arg .... (λ (ans) (... waiting for ans ... )))