SlideShare una empresa de Scribd logo
1 de 73
Descargar para leer sin conexión
We are OUDL.
            Organization for the Understanding of Dynamic Languages
                            http://meetup.com/dynamic/




Wednesday, August 22, 12

We are programming language enthusiasts
Check us out on Meetup.com
All events have been by members, for members
Each event has a theme, a selected pastry or baked good, and a horrible logo
What makes Objective C dynamic?




Wednesday, August 22, 12
What makes Objective C dynamic?        Kamehameha Bakery donuts



                                  Otto Cake cheesecake




                           Cake Couture cupcakes




                             Fendu Bakery croissants & cookies




                                             Saint Germain Bakery palmiers



Wednesday, August 22, 12
Mahalo.




Wednesday, August 22, 12
Y combinator
                                  Examples in Clojure.
                           Also includes: blenders and kittens.
                  Caveat emptor: I make no effort to teach you Clojure.


                                                                   Kyle Oba
                                                               @mudphone
                                                            Pas de Chocolat
Wednesday, August 22, 12
Not this one.
Wednesday, August 22, 12

Paul Graham did name his company after the *REAL* Y combinator.
But, why?
This one.
                 (defn Y
                   [g]
                   ((fn [x] (x x)) (fn [x]
                                    (g (fn [y] ((x x) y))))))




Wednesday, August 22, 12

Which is this thing, in Clojure.
Let’s get started.

                   Here’s a non-recursive
                   definition of factorial,
                          using the
                      Y combinator.
Wednesday, August 22, 12

Here it is. Thank you, good night and good luck.
(defn Y
                   [g]
                   ((fn [x] (x x)) (fn [x]
                                    (g (fn [y] ((x x) y))))))

                 (defn almost-factorial
                   [f]
                   (fn [n]
                     (if (= n 0)
                       1
                       (* n (f (dec n))))))

                 (defn factorial
                   [n]
                   ((Y almost-factorial) n))


Wednesday, August 22, 12

Here it is. Thank you, good night and good luck.
Questions?



Wednesday, August 22, 12
An example: 5!
                           (factorial 5) = 5 * 4 * 3 * 2 * 1 = 120



                           (defn factorial
                             [n]
                             (if (= n 0)
                               1
                               (* n (factorial (dec n)))))




Wednesday, August 22, 12

Let’s back up. This is how a sane person would define factorial... recursively.
here to here?

       (defn factorial                   (defn almost-factorial
         [n]                               [f]
         (if (= n 0)                       (fn [n]
           1                                 (if (= n 0)
           (* n (factorial (dec n)))))         1
                                               (* n (f (dec n))))))

                                         (defn Y
                                           [g]
                                           ((fn [x] (x x)) (fn [x]
                                                            (g (fn [y] ((x x) y))))))

                                         (defn factorial
                                           [n]
                                           ((Y almost-factorial) n))



Wednesday, August 22, 12

Recursive definition to non-recursive
2 Things

                           1) recursion

                           2) functions



Wednesday, August 22, 12
2 Things

                           1) recursion
                           2) functions



Wednesday, August 22, 12
“The Y combinator allows recursion
                                                     recursion...
                                as a set of rewrite rules,
                            without requiring native recursion
                                support in the language.”

                                        -- Someone on Wikipedia




Wednesday, August 22, 12
replace
                           “native recursion”
                                  with
                           manual recursion


Wednesday, August 22, 12
(defn factorial
           [n]                               (defn fact
           (if (= n 0)                         [n]
             1                                 (if (= n 0)
               (* n (factorial (dec n)))))       1
                                                 (* n (ERROR (dec n)))))




Wednesday, August 22, 12
(defn factorial
           [n]                               (defn fact
           (if (= n 0)                         [n]
             1                                 (if (= n 0)
               (* n (factorial (dec n)))))       1
                                                 (* n (ERROR (dec n)))))




                    n = 0 OK

                    n = 1 BOOM!




Wednesday, August 22, 12
(defn factorial
           [n]                               (defn fact                    (defn fact
           (if (= n 0)                         [n]                           [n]
             1                                 (if (= n 0)                   (if (= n 0)
               (* n (factorial (dec n)))))       1                             1
                                                 (* n (ERROR (dec n)))))       (* n (ERROR (dec n)


                                             (defn fact                    (defn fact
                                               [n]                           [n]
                                               (if (= n 0)                   (if (= n 0)
                                                 1                             1
                    n = 0 OK                     (* n (ERROR (dec n)))))       (* n (ERROR (dec n))


                                             (defn fact                    (defn fact
                                               [n]                           [n]
                    n = 1 BOOM!                (if (= n 0)                   (if (= n 0)
                                                 1                             1
                                                 (* n (ERROR (dec n)))))       (* n (ERROR (dec n)


                                             (defn fact                    (defn fact
                                               [n]                           [n]
                                               (if (= n 0)                   (if (= n 0)
                                                 1                             1
                                                 (* n (ERROR (dec n)))))       (* n (ERROR (dec n)

Wednesday, August 22, 12
(defn fact
                                                       (fn [n]                             (fn [n]
                   [n]
                                                         (if (= n 0)                         (if (= n
                   (if (= n 0)
                                                           1                                   1
                     1
                                                           (* n (ERROR (dec n)))))             (* n (
                      (* n (ERROR (dec n)))))


                                   (fn [n]                              (fn [n]
                                     (if (= n 0)                          (if (= n 0)
                                       1                                    1
                                       (* n (ERROR (dec n)))))              (* n (ERROR (dec n)))))




Wednesday, August 22, 12
(defn fact
                                                       (fn [n]                             (fn [n]
                   [n]
                                                         (if (= n 0)                         (if (= n
                   (if (= n 0)
                                                           1                                   1
                     1
                                                           (* n (ERROR (dec n)))))             (* n (
                      (* n (ERROR (dec n)))))


                                   (fn [n]                              (fn [n]
                                     (if (= n 0)                          (if (= n 0)
                                       1                                    1
                                       (* n (ERROR (dec n)))))              (* n (ERROR (dec n)))))




            n=0               n=1            n=2          n=3            n=4

Wednesday, August 22, 12
replace
                           “native recursion”
                                  with
                           manual recursion
                            “rewrite rules”

Wednesday, August 22, 12
2 Things

                           1) recursion

                           2) functions



Wednesday, August 22, 12
2 Things

                           1) recursion

                           2) functions

Wednesday, August 22, 12
Functions are machines.

                           Functions are relationships,
                           between inputs and outputs.




Wednesday, August 22, 12
A function is a blender.




Wednesday, August 22, 12
FIRST ORDER BLENDER
                           A normal blender that consumes single input
                                                   and creates output.




Wednesday, August 22, 12
FIRST ORDER BLENDER
                           A normal blender that consumes single input
                                                   and creates output.



       HIGHER ORDER BLENDER
                              A special blender that consumes a blender
                                            and outputs another blender.




Wednesday, August 22, 12
FIRST ORDER BLENDER
                           A normal blender that consumes single input
                                                   and creates output.



       HIGHER ORDER BLENDER
                              A special blender that consumes a blender
                                            and outputs another blender.



     FIXPOINT (BLENDER) COMBINATOR                                  Y
         Consumes a blender and produces a new blender that
                         can consume any number of inputs.

Wednesday, August 22, 12
ONE




Wednesday, August 22, 12
ONE




    (defn almost-factorial
       [f]
       (fn [n]
         (if (= n 0)
              1
              (* n (f (dec n))))))




Wednesday, August 22, 12
ONE      ANY




    (defn almost-factorial
       [f]
       (fn [n]
         (if (= n 0)
              1
              (* n (f (dec n))))))




Wednesday, August 22, 12
ONE          ANY




                                     Y


    (defn almost-factorial
       [f]                               factorial
       (fn [n]
         (if (= n 0)
              1
              (* n (f (dec n))))))




Wednesday, August 22, 12
if you squint

       (defn factorial                   (defn almost-factorial
         [n]                               [f]
         (if (= n 0)                       (fn [n]
           1                                 (if (= n 0)
           (* n (factorial (dec n)))))         1
                                               (* n (f (dec n))))))

                                         (defn Y
                                           [g]
                                           ((fn [x] (x x)) (fn [x]
                                                            (g (fn [y] ((x x) y))))))

                                         (defn factorial
                                           [n]
                                           ((Y almost-factorial) n))



Wednesday, August 22, 12

Derivation not possible in 3 minutes.
I’m so sorry.


 No kittens were blended during the creation of this presentation.
Wednesday, August 22, 12
No really, done now.


 No kittens were blended during the creation of this presentation.
Wednesday, August 22, 12
A Clojure Primer
     PARENTHESIS
                           (+ 1 2 3)
                           ;; => 6

     PREFIX NOTATION
                           (operator arg1 arg2 arg3)


     FUNCTIONS
                           (defn multby2               (fn [n] (* n 2))
                             [n]
                             (* n 2))
                           ;; (multby2 4) => 8

Wednesday, August 22, 12

1) First, a primer on LISP & Clojure
- parens for function call
- prefix notation, followed by arguments
2) And, function definition and anonymous functions
(defn simple-factorial
                    [n]
                    (if (= n 0)
                      1
                      (* n (simple-factorial (dec n)))))




Wednesday, August 22, 12

Here, we remove the recursive definition. Kind of delaying it, for now.
(defn simple-factorial
                    [n]
                    (if (= n 0)
                      1
                      (* n (simple-factorial (dec n)))))



                   (defn part
                     [self n]
                     (if (= n 0)
                       1
                       (* n (self self (dec n)))))
                   ;; (part part 5) => 120




Wednesday, August 22, 12

Here, we remove the recursive definition. Kind of delaying it, for now.
(defn simple-factorial
                    [n]
                    (if (= n 0)
                      1
                      (* n (simple-factorial (dec n)))))



                   (defn part
                     [self n]
                     (if (= n 0)
                       1
                       (* n (self self (dec n)))))
                   ;; (part part 5) => 120




Wednesday, August 22, 12

Change part to take a single arg, returning a function that takes n.
(defn part
                     [self n]
                     (if (= n 0)
                       1
                       (* n (self self (dec n)))))
                   ;; (part part 5) => 120


                   (defn part2
                     [self]
                     (fn [n]
                       (if (= n 0)
                         1
                         (* n ((self self) (dec n))))))
                   ;; ((part2 part2) 5) => 120



Wednesday, August 22, 12

Change part to take a single arg, returning a function that takes n.
(defn part
                     [self n]
                     (if (= n 0)
                       1
                       (* n (self self (dec n)))))
                   ;; (part part 5) => 120


                   (defn part2
                     [self]
                     (fn [n]
                       (if (= n 0)
                         1
                         (* n ((self self) (dec n))))))
                   ;; ((part2 part2) 5) => 120



Wednesday, August 22, 12

Replace (self self) with f, which blows up in a Stack Overflow... but, we press on.
(defn part2
                     [self]
                     (fn [n]
                       (if (= n 0)
                         1
                         (* n ((self self) (dec n))))))
                   ;; ((part2 part2) 5) => 120


                   (defn part3
                     [self]
                     (let [f (self self)]
                       (fn [n]
                         (if (= n 0)
                            1
                            (* n (f (dec n)))))))


Wednesday, August 22, 12

Replace (self self) with f, which blows up in a Stack Overflow... but, we press on.
(defn part2
                     [self]
                     (fn [n]
                       (if (= n 0)
                         1
                         (* n ((self self) (dec n))))))
                   ;; ((part2 part2) 5) => 120


                   (defn part3
                     [self]
                     (let [f (self self)]
                       (fn [n]
                         (if (= n 0)
                            1
                            (* n (f (dec n)))))))


Wednesday, August 22, 12

Bury, the (self self) call in a lambda.
(defn part3
                     [self]
                     (let [f (self self)]
                       (fn [n]
                         (if (= n 0)
                            1
                            (* n (f (dec n)))))))


                   (defn part4
                     [self]
                     (let [f (fn [y] ((self self) y))]
                       (fn [n]
                        (if (= n 0)
                          1
                          (* n (f (dec n)))))))


Wednesday, August 22, 12

Bury, the (self self) call in a lambda.
(defn part3
                     [self]
                     (let [f (self self)]
                       (fn [n]
                         (if (= n 0)
                            1
                            (* n (f (dec n)))))))


                   (defn part4
                     [self]
                     (let [f (fn [y] ((self self) y))]
                       (fn [n]
                        (if (= n 0)
                          1
                          (* n (f (dec n)))))))


Wednesday, August 22, 12

Rip out the function that looks almost like the factorial function. This is what we’re
generalizing. The Y combinator computes the fixpoint of this function.
(defn part4
                     [self]
                     (let [f (fn [y] ((self self) y))]
                       (fn [n]
                        (if (= n 0)
                          1
                          (* n (f (dec n)))))))


                   (defn almost-factorial
                     [f]
                     (fn [n]
                       (if (= n 0)
                         1
                         (* n (f (dec n))))))



Wednesday, August 22, 12

Rip out the function that looks almost like the factorial function. This is what we’re
generalizing. The Y combinator computes the fixpoint of this function.
(defn part4
                     [self]
                     (let [f (fn [y] ((self self) y))]
                       (fn [n]
                        (if (= n 0)
                          1
                          (* n (f (dec n)))))))


                   (defn almost-factorial
                     [f]
                     (fn [n]
                       (if (= n 0)
                         1
                         (* n (f (dec n))))))



Wednesday, August 22, 12

Insert almost-factorial into the part function.
(defn almost-factorial
                     [f]
                     (fn [n]
                       (if (= n 0)
                         1
                         (* n (f (dec n))))))



                   (defn part5
                     [self]
                     (let [f (fn [y] ((self self) y))]
                       (almost-factorial f)))




Wednesday, August 22, 12

Insert almost-factorial into the part function.
(defn almost-factorial
                     [f]
                     (fn [n]
                       (if (= n 0)
                         1
                         (* n (f (dec n))))))



                   (defn part5
                     [self]
                     (let [f (fn [y] ((self self) y))]
                       (almost-factorial f)))




Wednesday, August 22, 12

fact5 is a working factorial function, but we can generalize it
(defn part5
                     [self]
                     (let [f (fn [y] ((self self) y))]
                       (almost-factorial f)))




                   (defn fact5
                     [n]
                     ((part5 part5) n))




Wednesday, August 22, 12

fact5 is a working factorial function, but we can generalize it
(defn part5
                     [self]
                     (let [f (fn [y] ((self self) y))]
                       (almost-factorial f)))




                   (defn fact5
                     [n]
                     ((part5 part5) n))




Wednesday, August 22, 12

here we embed the definition the “part” function
(defn fact5
                     [n]
                     ((part5 part5) n))




                   (def fact6
                     (let [part (fn [self]
                                  (let [f (fn [y] ((self self) y))]
                                     (almost-factorial f)))]
                       (part part)))




Wednesday, August 22, 12

here we embed the definition the “part” function
(defn fact5
                     [n]
                     ((part5 part5) n))




                   (def fact6
                     (let [part (fn [self]
                                  (let [f (fn [y] ((self self) y))]
                                     (almost-factorial f)))]
                       (part part)))




Wednesday, August 22, 12

rename part => x
and self => x
for kicks really
(def fact6
                     (let [part (fn [self]
                                  (let [f (fn [y] ((self self) y))]
                                     (almost-factorial f)))]
                       (part part)))




                   (def fact7
                     (let [x (fn [x]
                               (let [f (fn [y] ((x x) y))]
                                 (almost-factorial f)))]
                       (x x)))




Wednesday, August 22, 12

rename part => x
and self => x
for kicks really
(def fact6
                       (let [part (fn [self]
                                    (let [f (fn [y] ((self self) y))]
                                       (almost-factorial f)))]
                         (part part)))




                   (def fact7
                     (let [x (fn [x]
                               (let [f (fn [y] ((x x) y))]
                                 (almost-factorial f)))]
                       (x x)))




Wednesday, August 22, 12

replace the (x x) invocation with a lambda of the same
(def fact7
                     (let [x (fn [x]
                               (let [f (fn [y] ((x x) y))]
                                 (almost-factorial f)))]
                       (x x)))




                   (def fact8
                     ((fn [x]
                        (x x)) (fn [x]
                                 (let [f (fn [y] ((x x) y))]
                                   (almost-factorial f)))))




Wednesday, August 22, 12

replace the (x x) invocation with a lambda of the same
(def fact7
                     (let [x (fn [x]
                               (let [f (fn [y] ((x x) y))]
                                 (almost-factorial f)))]
                       (x x)))




                   (def fact8
                     ((fn [x]
                        (x x)) (fn [x]
                                 (let [f (fn [y] ((x x) y))]
                                   (almost-factorial f)))))




Wednesday, August 22, 12

Rename to Y
and generalize, by accepting a function g and using this to replace almost-factorial
(def fact8
                     ((fn [x]
                        (x x)) (fn [x]
                                 (let [f (fn [y] ((x x) y))]
                                   (almost-factorial f)))))




                   (defn nearly-Y
                     [g]
                     ((fn [x] (x x)) (fn [x]
                                      (let [f (fn [y] ((x x) y))]
                                        (g f)))))




Wednesday, August 22, 12

Rename to Y
and generalize, by accepting a function g and using this to replace almost-factorial
(def fact8
                     ((fn [x]
                        (x x)) (fn [x]
                                 (let [f (fn [y] ((x x) y))]
                                   (almost-factorial f)))))




                   (defn nearly-Y
                     [g]
                     ((fn [x] (x x)) (fn [x]
                                      (let [f (fn [y] ((x x) y))]
                                        (g f)))))




Wednesday, August 22, 12

Replace f with the anonymous function bound to it
(defn nearly-Y
                     [g]
                     ((fn [x] (x x)) (fn [x]
                                      (let [f (fn [y] ((x x) y))]
                                        (g f)))))




                   (defn Y
                     [g]
                     ((fn [x] (x x)) (fn [x]
                                      (g (fn [y] ((x x) y))))))




Wednesday, August 22, 12

Replace f with the anonymous function bound to it
(defn nearly-Y
                     [g]
                     ((fn [x] (x x)) (fn [x]
                                      (let [f (fn [y] ((x x) y))]
                                        (g f)))))




                   (defn Y
                     [g]
                     ((fn [x] (x x)) (fn [x]
                                      (g (fn [y] ((x x) y))))))




Wednesday, August 22, 12
(defn Y
                     [g]
                     ((fn [x] (x x)) (fn [x]
                                      (g (fn [y] ((x x) y))))))




                   (defn factorial
                     [n]
                     ((Y almost-factorial) n))




Wednesday, August 22, 12
(defn Y
                     [g]
                     ((fn [x] (x x)) (fn [x]
                                      (g (fn [y] ((x x) y))))))




                            I’m so sorry.
                   (defn factorial
                     [n]
                     ((Y almost-factorial) n))




Wednesday, August 22, 12
I’m so sorry.


 No kittens were blended during the creation of this presentation.
Wednesday, August 22, 12
(defn almost-factorial            (Y almost-factorial)
         [f]
         (fn [n]
                                       ;; ((Y almost-factorial) 5) => 120
           (if (= n 0)
                1
                (* n (f (dec n))))))




Wednesday, August 22, 12
(defn almost-factorial            (Y almost-factorial)
         [f]
         (fn [n]
                                       ;; ((Y almost-factorial) 5) => 120
           (if (= n 0)
                1
                (* n (f (dec n))))))




             Y




Wednesday, August 22, 12
(defn almost-factorial            (Y almost-factorial)
         [f]
         (fn [n]
                                       ;; ((Y almost-factorial) 5) => 120
           (if (= n 0)
                1
                (* n (f (dec n))))))




             Y




    FACTORIAL
Wednesday, August 22, 12
(defn almost-factorial                 (Y almost-factorial)
         [f]
         (fn [n]
                                            ;; ((Y almost-factorial) 5) => 120
           (if (= n 0)
                1
                (* n (f (dec n))))))




                            (defn fact                            (defn fact
                              [n]                                   [n]
                              (if (= n 0)                           (if (= n 0)

             Y
                                1                                     1
                                (* n (ERROR (dec n)))))               (* n (ERROR (dec n)))))


                                              (defn fact                           (defn fact
                                                [n]                                  [n]
                                                (if (= n 0)                          (if (= n 0)
                                                  1                                    1
                                                  (* n (ERROR (dec n)))))              (* n (ERROR (d




    FACTORIAL
Wednesday, August 22, 12
(defn almost-factorial
        [f]
        (fn [n]
          (if (= n 0)
                1
                (* n (f (dec n))))))




                           Y




            factorial

Wednesday, August 22, 12
(defn almost-factorial
        [f]
        (fn [n]
          (if (= n 0)
                1
                (* n (f (dec n))))))




                           Y




            factorial

Wednesday, August 22, 12
(defn almost-factorial
        [f]
        (fn [n]
          (if (= n 0)
                1                      ONE
                (* n (f (dec n))))))




                           Y




            factorial

Wednesday, August 22, 12
(defn almost-factorial
        [f]
        (fn [n]
          (if (= n 0)                        ANY
                1                      ONE
                (* n (f (dec n))))))




                           Y




            factorial

Wednesday, August 22, 12

Más contenido relacionado

Destacado

Destacado (7)

Javascript call ObjC
Javascript call ObjCJavascript call ObjC
Javascript call ObjC
 
Objective c runtime
Objective c runtimeObjective c runtime
Objective c runtime
 
Working with AFNetworking
Working with AFNetworkingWorking with AFNetworking
Working with AFNetworking
 
Jak nastartovat vývojový projekt
Jak nastartovat vývojový projektJak nastartovat vývojový projekt
Jak nastartovat vývojový projekt
 
Writing readable Clojure code
Writing readable Clojure codeWriting readable Clojure code
Writing readable Clojure code
 
What Makes Objective C Dynamic?
What Makes Objective C Dynamic?What Makes Objective C Dynamic?
What Makes Objective C Dynamic?
 
Core Data with multiple managed object contexts
Core Data with multiple managed object contextsCore Data with multiple managed object contexts
Core Data with multiple managed object contexts
 

Similar a OUDL Y Combinator (10)

Question bank unit ii engineering mathematics ii
Question bank unit ii engineering mathematics iiQuestion bank unit ii engineering mathematics ii
Question bank unit ii engineering mathematics ii
 
Plug-and-Play methods for inverse problems in imagine, by Julie Delon
Plug-and-Play methods for inverse problems in imagine, by Julie DelonPlug-and-Play methods for inverse problems in imagine, by Julie Delon
Plug-and-Play methods for inverse problems in imagine, by Julie Delon
 
Lesson 19: Double Integrals over General Regions
Lesson 19: Double Integrals over General RegionsLesson 19: Double Integrals over General Regions
Lesson 19: Double Integrals over General Regions
 
7.4 composition
7.4 composition7.4 composition
7.4 composition
 
Lesson 29: Integration by Substition
Lesson 29: Integration by SubstitionLesson 29: Integration by Substition
Lesson 29: Integration by Substition
 
X2 T05 06 Partial Fractions
X2 T05 06 Partial FractionsX2 T05 06 Partial Fractions
X2 T05 06 Partial Fractions
 
Lesson 27: Integration by Substitution (Section 041 slides)
Lesson 27: Integration by Substitution (Section 041 slides)Lesson 27: Integration by Substitution (Section 041 slides)
Lesson 27: Integration by Substitution (Section 041 slides)
 
Lesson 27: Integration by Substitution (Section 041 slides)
Lesson 27: Integration by Substitution (Section 041 slides)Lesson 27: Integration by Substitution (Section 041 slides)
Lesson 27: Integration by Substitution (Section 041 slides)
 
Lesson 4 Nov 17 09
Lesson 4 Nov 17 09Lesson 4 Nov 17 09
Lesson 4 Nov 17 09
 
Lesson 29: Integration by Substition (worksheet solutions)
Lesson 29: Integration by Substition (worksheet solutions)Lesson 29: Integration by Substition (worksheet solutions)
Lesson 29: Integration by Substition (worksheet solutions)
 

Último

Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptxHarnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
FIDO Alliance
 
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc
 
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider  Progress from Awareness to Implementation.pptxTales from a Passkey Provider  Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
FIDO Alliance
 

Último (20)

Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptxHarnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
 
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
 
Top 10 CodeIgniter Development Companies
Top 10 CodeIgniter Development CompaniesTop 10 CodeIgniter Development Companies
Top 10 CodeIgniter Development Companies
 
WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024
 
Google I/O Extended 2024 Warsaw
Google I/O Extended 2024 WarsawGoogle I/O Extended 2024 Warsaw
Google I/O Extended 2024 Warsaw
 
Generative AI Use Cases and Applications.pdf
Generative AI Use Cases and Applications.pdfGenerative AI Use Cases and Applications.pdf
Generative AI Use Cases and Applications.pdf
 
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
 
Long journey of Ruby Standard library at RubyKaigi 2024
Long journey of Ruby Standard library at RubyKaigi 2024Long journey of Ruby Standard library at RubyKaigi 2024
Long journey of Ruby Standard library at RubyKaigi 2024
 
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
 
2024 May Patch Tuesday
2024 May Patch Tuesday2024 May Patch Tuesday
2024 May Patch Tuesday
 
How we scaled to 80K users by doing nothing!.pdf
How we scaled to 80K users by doing nothing!.pdfHow we scaled to 80K users by doing nothing!.pdf
How we scaled to 80K users by doing nothing!.pdf
 
How Red Hat Uses FDO in Device Lifecycle _ Costin and Vitaliy at Red Hat.pdf
How Red Hat Uses FDO in Device Lifecycle _ Costin and Vitaliy at Red Hat.pdfHow Red Hat Uses FDO in Device Lifecycle _ Costin and Vitaliy at Red Hat.pdf
How Red Hat Uses FDO in Device Lifecycle _ Costin and Vitaliy at Red Hat.pdf
 
The Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightThe Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and Insight
 
Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...
Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...
Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...
 
ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...
ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...
ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...
 
ADP Passwordless Journey Case Study.pptx
ADP Passwordless Journey Case Study.pptxADP Passwordless Journey Case Study.pptx
ADP Passwordless Journey Case Study.pptx
 
State of the Smart Building Startup Landscape 2024!
State of the Smart Building Startup Landscape 2024!State of the Smart Building Startup Landscape 2024!
State of the Smart Building Startup Landscape 2024!
 
Simplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdf
Simplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdfSimplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdf
Simplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdf
 
Collecting & Temporal Analysis of Behavioral Web Data - Tales From The Inside
Collecting & Temporal Analysis of Behavioral Web Data - Tales From The InsideCollecting & Temporal Analysis of Behavioral Web Data - Tales From The Inside
Collecting & Temporal Analysis of Behavioral Web Data - Tales From The Inside
 
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider  Progress from Awareness to Implementation.pptxTales from a Passkey Provider  Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
 

OUDL Y Combinator

  • 1. We are OUDL. Organization for the Understanding of Dynamic Languages http://meetup.com/dynamic/ Wednesday, August 22, 12 We are programming language enthusiasts Check us out on Meetup.com All events have been by members, for members Each event has a theme, a selected pastry or baked good, and a horrible logo
  • 2. What makes Objective C dynamic? Wednesday, August 22, 12
  • 3. What makes Objective C dynamic? Kamehameha Bakery donuts Otto Cake cheesecake Cake Couture cupcakes Fendu Bakery croissants & cookies Saint Germain Bakery palmiers Wednesday, August 22, 12
  • 5. Y combinator Examples in Clojure. Also includes: blenders and kittens. Caveat emptor: I make no effort to teach you Clojure. Kyle Oba @mudphone Pas de Chocolat Wednesday, August 22, 12
  • 6. Not this one. Wednesday, August 22, 12 Paul Graham did name his company after the *REAL* Y combinator. But, why?
  • 7. This one. (defn Y [g] ((fn [x] (x x)) (fn [x] (g (fn [y] ((x x) y)))))) Wednesday, August 22, 12 Which is this thing, in Clojure.
  • 8. Let’s get started. Here’s a non-recursive definition of factorial, using the Y combinator. Wednesday, August 22, 12 Here it is. Thank you, good night and good luck.
  • 9. (defn Y [g] ((fn [x] (x x)) (fn [x] (g (fn [y] ((x x) y)))))) (defn almost-factorial [f] (fn [n] (if (= n 0) 1 (* n (f (dec n)))))) (defn factorial [n] ((Y almost-factorial) n)) Wednesday, August 22, 12 Here it is. Thank you, good night and good luck.
  • 11. An example: 5! (factorial 5) = 5 * 4 * 3 * 2 * 1 = 120 (defn factorial [n] (if (= n 0) 1 (* n (factorial (dec n))))) Wednesday, August 22, 12 Let’s back up. This is how a sane person would define factorial... recursively.
  • 12. here to here? (defn factorial (defn almost-factorial [n] [f] (if (= n 0) (fn [n] 1 (if (= n 0) (* n (factorial (dec n))))) 1 (* n (f (dec n)))))) (defn Y [g] ((fn [x] (x x)) (fn [x] (g (fn [y] ((x x) y)))))) (defn factorial [n] ((Y almost-factorial) n)) Wednesday, August 22, 12 Recursive definition to non-recursive
  • 13. 2 Things 1) recursion 2) functions Wednesday, August 22, 12
  • 14. 2 Things 1) recursion 2) functions Wednesday, August 22, 12
  • 15. “The Y combinator allows recursion recursion... as a set of rewrite rules, without requiring native recursion support in the language.” -- Someone on Wikipedia Wednesday, August 22, 12
  • 16. replace “native recursion” with manual recursion Wednesday, August 22, 12
  • 17. (defn factorial [n] (defn fact (if (= n 0) [n] 1 (if (= n 0) (* n (factorial (dec n))))) 1 (* n (ERROR (dec n))))) Wednesday, August 22, 12
  • 18. (defn factorial [n] (defn fact (if (= n 0) [n] 1 (if (= n 0) (* n (factorial (dec n))))) 1 (* n (ERROR (dec n))))) n = 0 OK n = 1 BOOM! Wednesday, August 22, 12
  • 19. (defn factorial [n] (defn fact (defn fact (if (= n 0) [n] [n] 1 (if (= n 0) (if (= n 0) (* n (factorial (dec n))))) 1 1 (* n (ERROR (dec n))))) (* n (ERROR (dec n) (defn fact (defn fact [n] [n] (if (= n 0) (if (= n 0) 1 1 n = 0 OK (* n (ERROR (dec n))))) (* n (ERROR (dec n)) (defn fact (defn fact [n] [n] n = 1 BOOM! (if (= n 0) (if (= n 0) 1 1 (* n (ERROR (dec n))))) (* n (ERROR (dec n) (defn fact (defn fact [n] [n] (if (= n 0) (if (= n 0) 1 1 (* n (ERROR (dec n))))) (* n (ERROR (dec n) Wednesday, August 22, 12
  • 20. (defn fact (fn [n] (fn [n] [n] (if (= n 0) (if (= n (if (= n 0) 1 1 1 (* n (ERROR (dec n))))) (* n ( (* n (ERROR (dec n))))) (fn [n] (fn [n] (if (= n 0) (if (= n 0) 1 1 (* n (ERROR (dec n))))) (* n (ERROR (dec n))))) Wednesday, August 22, 12
  • 21. (defn fact (fn [n] (fn [n] [n] (if (= n 0) (if (= n (if (= n 0) 1 1 1 (* n (ERROR (dec n))))) (* n ( (* n (ERROR (dec n))))) (fn [n] (fn [n] (if (= n 0) (if (= n 0) 1 1 (* n (ERROR (dec n))))) (* n (ERROR (dec n))))) n=0 n=1 n=2 n=3 n=4 Wednesday, August 22, 12
  • 22. replace “native recursion” with manual recursion “rewrite rules” Wednesday, August 22, 12
  • 23. 2 Things 1) recursion 2) functions Wednesday, August 22, 12
  • 24. 2 Things 1) recursion 2) functions Wednesday, August 22, 12
  • 25. Functions are machines. Functions are relationships, between inputs and outputs. Wednesday, August 22, 12
  • 26. A function is a blender. Wednesday, August 22, 12
  • 27. FIRST ORDER BLENDER A normal blender that consumes single input and creates output. Wednesday, August 22, 12
  • 28. FIRST ORDER BLENDER A normal blender that consumes single input and creates output. HIGHER ORDER BLENDER A special blender that consumes a blender and outputs another blender. Wednesday, August 22, 12
  • 29. FIRST ORDER BLENDER A normal blender that consumes single input and creates output. HIGHER ORDER BLENDER A special blender that consumes a blender and outputs another blender. FIXPOINT (BLENDER) COMBINATOR Y Consumes a blender and produces a new blender that can consume any number of inputs. Wednesday, August 22, 12
  • 31. ONE (defn almost-factorial [f] (fn [n] (if (= n 0) 1 (* n (f (dec n)))))) Wednesday, August 22, 12
  • 32. ONE ANY (defn almost-factorial [f] (fn [n] (if (= n 0) 1 (* n (f (dec n)))))) Wednesday, August 22, 12
  • 33. ONE ANY Y (defn almost-factorial [f] factorial (fn [n] (if (= n 0) 1 (* n (f (dec n)))))) Wednesday, August 22, 12
  • 34. if you squint (defn factorial (defn almost-factorial [n] [f] (if (= n 0) (fn [n] 1 (if (= n 0) (* n (factorial (dec n))))) 1 (* n (f (dec n)))))) (defn Y [g] ((fn [x] (x x)) (fn [x] (g (fn [y] ((x x) y)))))) (defn factorial [n] ((Y almost-factorial) n)) Wednesday, August 22, 12 Derivation not possible in 3 minutes.
  • 35. I’m so sorry. No kittens were blended during the creation of this presentation. Wednesday, August 22, 12
  • 36. No really, done now. No kittens were blended during the creation of this presentation. Wednesday, August 22, 12
  • 37. A Clojure Primer PARENTHESIS (+ 1 2 3) ;; => 6 PREFIX NOTATION (operator arg1 arg2 arg3) FUNCTIONS (defn multby2 (fn [n] (* n 2)) [n] (* n 2)) ;; (multby2 4) => 8 Wednesday, August 22, 12 1) First, a primer on LISP & Clojure - parens for function call - prefix notation, followed by arguments 2) And, function definition and anonymous functions
  • 38. (defn simple-factorial [n] (if (= n 0) 1 (* n (simple-factorial (dec n))))) Wednesday, August 22, 12 Here, we remove the recursive definition. Kind of delaying it, for now.
  • 39. (defn simple-factorial [n] (if (= n 0) 1 (* n (simple-factorial (dec n))))) (defn part [self n] (if (= n 0) 1 (* n (self self (dec n))))) ;; (part part 5) => 120 Wednesday, August 22, 12 Here, we remove the recursive definition. Kind of delaying it, for now.
  • 40. (defn simple-factorial [n] (if (= n 0) 1 (* n (simple-factorial (dec n))))) (defn part [self n] (if (= n 0) 1 (* n (self self (dec n))))) ;; (part part 5) => 120 Wednesday, August 22, 12 Change part to take a single arg, returning a function that takes n.
  • 41. (defn part [self n] (if (= n 0) 1 (* n (self self (dec n))))) ;; (part part 5) => 120 (defn part2 [self] (fn [n] (if (= n 0) 1 (* n ((self self) (dec n)))))) ;; ((part2 part2) 5) => 120 Wednesday, August 22, 12 Change part to take a single arg, returning a function that takes n.
  • 42. (defn part [self n] (if (= n 0) 1 (* n (self self (dec n))))) ;; (part part 5) => 120 (defn part2 [self] (fn [n] (if (= n 0) 1 (* n ((self self) (dec n)))))) ;; ((part2 part2) 5) => 120 Wednesday, August 22, 12 Replace (self self) with f, which blows up in a Stack Overflow... but, we press on.
  • 43. (defn part2 [self] (fn [n] (if (= n 0) 1 (* n ((self self) (dec n)))))) ;; ((part2 part2) 5) => 120 (defn part3 [self] (let [f (self self)] (fn [n] (if (= n 0) 1 (* n (f (dec n))))))) Wednesday, August 22, 12 Replace (self self) with f, which blows up in a Stack Overflow... but, we press on.
  • 44. (defn part2 [self] (fn [n] (if (= n 0) 1 (* n ((self self) (dec n)))))) ;; ((part2 part2) 5) => 120 (defn part3 [self] (let [f (self self)] (fn [n] (if (= n 0) 1 (* n (f (dec n))))))) Wednesday, August 22, 12 Bury, the (self self) call in a lambda.
  • 45. (defn part3 [self] (let [f (self self)] (fn [n] (if (= n 0) 1 (* n (f (dec n))))))) (defn part4 [self] (let [f (fn [y] ((self self) y))] (fn [n] (if (= n 0) 1 (* n (f (dec n))))))) Wednesday, August 22, 12 Bury, the (self self) call in a lambda.
  • 46. (defn part3 [self] (let [f (self self)] (fn [n] (if (= n 0) 1 (* n (f (dec n))))))) (defn part4 [self] (let [f (fn [y] ((self self) y))] (fn [n] (if (= n 0) 1 (* n (f (dec n))))))) Wednesday, August 22, 12 Rip out the function that looks almost like the factorial function. This is what we’re generalizing. The Y combinator computes the fixpoint of this function.
  • 47. (defn part4 [self] (let [f (fn [y] ((self self) y))] (fn [n] (if (= n 0) 1 (* n (f (dec n))))))) (defn almost-factorial [f] (fn [n] (if (= n 0) 1 (* n (f (dec n)))))) Wednesday, August 22, 12 Rip out the function that looks almost like the factorial function. This is what we’re generalizing. The Y combinator computes the fixpoint of this function.
  • 48. (defn part4 [self] (let [f (fn [y] ((self self) y))] (fn [n] (if (= n 0) 1 (* n (f (dec n))))))) (defn almost-factorial [f] (fn [n] (if (= n 0) 1 (* n (f (dec n)))))) Wednesday, August 22, 12 Insert almost-factorial into the part function.
  • 49. (defn almost-factorial [f] (fn [n] (if (= n 0) 1 (* n (f (dec n)))))) (defn part5 [self] (let [f (fn [y] ((self self) y))] (almost-factorial f))) Wednesday, August 22, 12 Insert almost-factorial into the part function.
  • 50. (defn almost-factorial [f] (fn [n] (if (= n 0) 1 (* n (f (dec n)))))) (defn part5 [self] (let [f (fn [y] ((self self) y))] (almost-factorial f))) Wednesday, August 22, 12 fact5 is a working factorial function, but we can generalize it
  • 51. (defn part5 [self] (let [f (fn [y] ((self self) y))] (almost-factorial f))) (defn fact5 [n] ((part5 part5) n)) Wednesday, August 22, 12 fact5 is a working factorial function, but we can generalize it
  • 52. (defn part5 [self] (let [f (fn [y] ((self self) y))] (almost-factorial f))) (defn fact5 [n] ((part5 part5) n)) Wednesday, August 22, 12 here we embed the definition the “part” function
  • 53. (defn fact5 [n] ((part5 part5) n)) (def fact6 (let [part (fn [self] (let [f (fn [y] ((self self) y))] (almost-factorial f)))] (part part))) Wednesday, August 22, 12 here we embed the definition the “part” function
  • 54. (defn fact5 [n] ((part5 part5) n)) (def fact6 (let [part (fn [self] (let [f (fn [y] ((self self) y))] (almost-factorial f)))] (part part))) Wednesday, August 22, 12 rename part => x and self => x for kicks really
  • 55. (def fact6 (let [part (fn [self] (let [f (fn [y] ((self self) y))] (almost-factorial f)))] (part part))) (def fact7 (let [x (fn [x] (let [f (fn [y] ((x x) y))] (almost-factorial f)))] (x x))) Wednesday, August 22, 12 rename part => x and self => x for kicks really
  • 56. (def fact6 (let [part (fn [self] (let [f (fn [y] ((self self) y))] (almost-factorial f)))] (part part))) (def fact7 (let [x (fn [x] (let [f (fn [y] ((x x) y))] (almost-factorial f)))] (x x))) Wednesday, August 22, 12 replace the (x x) invocation with a lambda of the same
  • 57. (def fact7 (let [x (fn [x] (let [f (fn [y] ((x x) y))] (almost-factorial f)))] (x x))) (def fact8 ((fn [x] (x x)) (fn [x] (let [f (fn [y] ((x x) y))] (almost-factorial f))))) Wednesday, August 22, 12 replace the (x x) invocation with a lambda of the same
  • 58. (def fact7 (let [x (fn [x] (let [f (fn [y] ((x x) y))] (almost-factorial f)))] (x x))) (def fact8 ((fn [x] (x x)) (fn [x] (let [f (fn [y] ((x x) y))] (almost-factorial f))))) Wednesday, August 22, 12 Rename to Y and generalize, by accepting a function g and using this to replace almost-factorial
  • 59. (def fact8 ((fn [x] (x x)) (fn [x] (let [f (fn [y] ((x x) y))] (almost-factorial f))))) (defn nearly-Y [g] ((fn [x] (x x)) (fn [x] (let [f (fn [y] ((x x) y))] (g f))))) Wednesday, August 22, 12 Rename to Y and generalize, by accepting a function g and using this to replace almost-factorial
  • 60. (def fact8 ((fn [x] (x x)) (fn [x] (let [f (fn [y] ((x x) y))] (almost-factorial f))))) (defn nearly-Y [g] ((fn [x] (x x)) (fn [x] (let [f (fn [y] ((x x) y))] (g f))))) Wednesday, August 22, 12 Replace f with the anonymous function bound to it
  • 61. (defn nearly-Y [g] ((fn [x] (x x)) (fn [x] (let [f (fn [y] ((x x) y))] (g f))))) (defn Y [g] ((fn [x] (x x)) (fn [x] (g (fn [y] ((x x) y)))))) Wednesday, August 22, 12 Replace f with the anonymous function bound to it
  • 62. (defn nearly-Y [g] ((fn [x] (x x)) (fn [x] (let [f (fn [y] ((x x) y))] (g f))))) (defn Y [g] ((fn [x] (x x)) (fn [x] (g (fn [y] ((x x) y)))))) Wednesday, August 22, 12
  • 63. (defn Y [g] ((fn [x] (x x)) (fn [x] (g (fn [y] ((x x) y)))))) (defn factorial [n] ((Y almost-factorial) n)) Wednesday, August 22, 12
  • 64. (defn Y [g] ((fn [x] (x x)) (fn [x] (g (fn [y] ((x x) y)))))) I’m so sorry. (defn factorial [n] ((Y almost-factorial) n)) Wednesday, August 22, 12
  • 65. I’m so sorry. No kittens were blended during the creation of this presentation. Wednesday, August 22, 12
  • 66. (defn almost-factorial (Y almost-factorial) [f] (fn [n] ;; ((Y almost-factorial) 5) => 120 (if (= n 0) 1 (* n (f (dec n)))))) Wednesday, August 22, 12
  • 67. (defn almost-factorial (Y almost-factorial) [f] (fn [n] ;; ((Y almost-factorial) 5) => 120 (if (= n 0) 1 (* n (f (dec n)))))) Y Wednesday, August 22, 12
  • 68. (defn almost-factorial (Y almost-factorial) [f] (fn [n] ;; ((Y almost-factorial) 5) => 120 (if (= n 0) 1 (* n (f (dec n)))))) Y FACTORIAL Wednesday, August 22, 12
  • 69. (defn almost-factorial (Y almost-factorial) [f] (fn [n] ;; ((Y almost-factorial) 5) => 120 (if (= n 0) 1 (* n (f (dec n)))))) (defn fact (defn fact [n] [n] (if (= n 0) (if (= n 0) Y 1 1 (* n (ERROR (dec n))))) (* n (ERROR (dec n))))) (defn fact (defn fact [n] [n] (if (= n 0) (if (= n 0) 1 1 (* n (ERROR (dec n))))) (* n (ERROR (d FACTORIAL Wednesday, August 22, 12
  • 70. (defn almost-factorial [f] (fn [n] (if (= n 0) 1 (* n (f (dec n)))))) Y factorial Wednesday, August 22, 12
  • 71. (defn almost-factorial [f] (fn [n] (if (= n 0) 1 (* n (f (dec n)))))) Y factorial Wednesday, August 22, 12
  • 72. (defn almost-factorial [f] (fn [n] (if (= n 0) 1 ONE (* n (f (dec n)))))) Y factorial Wednesday, August 22, 12
  • 73. (defn almost-factorial [f] (fn [n] (if (= n 0) ANY 1 ONE (* n (f (dec n)))))) Y factorial Wednesday, August 22, 12