Skip to content

Instantly share code, notes, and snippets.

@gdevanla
Created February 7, 2018 14:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gdevanla/7f3a5a6015757796665e9150259ed38c to your computer and use it in GitHub Desktop.
Save gdevanla/7f3a5a6015757796665e9150259ed38c to your computer and use it in GitHub Desktop.
Y-Combinator description in Racket
;; lambda expression do not have any assignments
;; so we will use the form where there is not lambda expressions
((lambda ()
(define (adder n) (+ n 1))
(define (mult3 n) (* n 3))
(mult3 (adder 10))
))
;; create make-adder and compose using higher-order functions
((lambda ()
(define (make-adder a) (lambda (n) (+ n 1)))
(define (mult3 n) (* n 3))
(define (compose f g) (lambda (x) (f (g x))))
((compose mult3 (make-adder 1)) 10)))
;; tenants correspondence principle
;; introduce binding
;; wrapping a function
;; inlining
;; tenants correspondence principle
((lambda ()
(define (make-adder a) (lambda (n) (+ n 1)))
(define (mult3 n) ((lambda () (* n 3)))) ;; update due to Tenants corresponse principle
(define (compose f g) ((lambda () (lambda (x) (f (g x)))))) ;;update with Tenants correpondence principle
((compose mult3 (make-adder 1)) 10)))
;; introduce a binding
;; wrapping a function
((lambda (x) (+ x 1)) 10)
((lambda ()
(define (make-adder a) (lambda (n1) ((lambda (n) (+ n a)) n1))) ;; wrapping a function
(define (mult3 n) ((lambda (n) (* n 3)) n))
(define (compose f g) (
(lambda (v)
((lambda () (lambda (x) (f (g x)))))) 1234)) ;; introduce binding
((compose mult3 (make-adder 1)) 10)))
;; inlining
((lambda ()
;;(define (make-adder) (lambda (a) (lambda (n1) ((lambda (n) (+ n a)) n1)))) ;; wrapping a function
;;(define (mult3 n) ((lambda (n) (* n 3)) n))
(define (compose f g) (
(lambda (v)
((lambda () (lambda (x) (f (g x)))))) 1234)) ;; introduce binding
((compose
(lambda (n) (* n 3) n)
((lambda (a) (lambda (n1) ((lambda (n) (+ n a)) n1))) 1))
10)))
;; inlinit compose
((lambda ()
;;(define (make-adder) (lambda (a) (lambda (n1) ((lambda (n) (+ n a)) n1)))) ;; wrapping a function
;;(define (mult3 n) ((lambda (n) (* n 3)) n))
;;(define (compose) (lambda (f g)
;; (lambda (v)
;; ((lambda () (lambda (x) (f (g x)))))) 1234)) ;; introduce binding
(((lambda (f g)
((lambda (v)
((lambda () (lambda (x) (f (g x)))))) 1234))
(lambda (n) (* n 10))
((lambda (a) (lambda (n1) ((lambda (n) (+ n a)) n1))) 20)) 40)))
((lambda ()
(((lambda (f g)
((lambda (v)
((lambda () (lambda (x) (f (g x)))))) 1234))
(lambda (x) (* x 10))
(lambda (x) (+ x 20))) 40)))
((lambda (a) (lambda (n1) ((lambda (n) (+ n a)) n1))) 10)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment