We are OUDL.            Organization for the Understanding of Dynamic Languages                            http://meetup.c...
What makes Objective C dynamic?Wednesday, August 22, 12
What makes Objective C dynamic?        Kamehameha Bakery donuts                                  Otto Cake cheesecake     ...
Mahalo.Wednesday, August 22, 12
Y combinator                                  Examples in Clojure.                           Also includes: blenders and k...
Not this one.Wednesday, August 22, 12Paul Graham did name his company after the *REAL* Y combinator.But, why?
This one.                 (defn Y                   [g]                   ((fn [x] (x x)) (fn [x]                         ...
Let’s get started.                   Here’s a non-recursive                   definition of factorial,                     ...
(defn Y                   [g]                   ((fn [x] (x x)) (fn [x]                                    (g (fn [y] ((x ...
Questions?Wednesday, August 22, 12
An example: 5!                           (factorial 5) = 5 * 4 * 3 * 2 * 1 = 120                           (defn factorial...
here to here?       (defn factorial                   (defn almost-factorial         [n]                               [f]...
2 Things                           1) recursion                           2) functionsWednesday, August 22, 12
2 Things                           1) recursion                           2) functionsWednesday, August 22, 12
“The Y combinator allows recursion                                                     recursion...                       ...
replace                           “native recursion”                                  with                           manua...
(defn factorial           [n]                               (defn fact           (if (= n 0)                         [n]  ...
(defn factorial           [n]                               (defn fact           (if (= n 0)                         [n]  ...
(defn factorial           [n]                               (defn fact                    (defn fact           (if (= n 0)...
(defn fact                                                       (fn [n]                             (fn [n]              ...
(defn fact                                                       (fn [n]                             (fn [n]              ...
replace                           “native recursion”                                  with                           manua...
2 Things                           1) recursion                           2) functionsWednesday, August 22, 12
2 Things                           1) recursion                           2) functionsWednesday, August 22, 12
Functions are machines.                           Functions are relationships,                           between inputs an...
A function is a blender.Wednesday, August 22, 12
FIRST ORDER BLENDER                           A normal blender that consumes single input                                 ...
FIRST ORDER BLENDER                           A normal blender that consumes single input                                 ...
FIRST ORDER BLENDER                           A normal blender that consumes single input                                 ...
ONEWednesday, August 22, 12
ONE    (defn almost-factorial       [f]       (fn [n]         (if (= n 0)              1              (* n (f (dec n))))))...
ONE      ANY    (defn almost-factorial       [f]       (fn [n]         (if (= n 0)              1              (* n (f (de...
ONE          ANY                                     Y    (defn almost-factorial       [f]                               f...
if you squint       (defn factorial                   (defn almost-factorial         [n]                               [f]...
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...
(defn simple-factorial                    [n]                    (if (= n 0)                      1                      (...
(defn simple-factorial                    [n]                    (if (= n 0)                      1                      (...
(defn simple-factorial                    [n]                    (if (= n 0)                      1                      (...
(defn part                     [self n]                     (if (= n 0)                       1                       (* n...
(defn part                     [self n]                     (if (= n 0)                       1                       (* n...
(defn part2                     [self]                     (fn [n]                       (if (= n 0)                      ...
(defn part2                     [self]                     (fn [n]                       (if (= n 0)                      ...
(defn part3                     [self]                     (let [f (self self)]                       (fn [n]             ...
(defn part3                     [self]                     (let [f (self self)]                       (fn [n]             ...
(defn part4                     [self]                     (let [f (fn [y] ((self self) y))]                       (fn [n]...
(defn part4                     [self]                     (let [f (fn [y] ((self self) y))]                       (fn [n]...
(defn almost-factorial                     [f]                     (fn [n]                       (if (= n 0)              ...
(defn almost-factorial                     [f]                     (fn [n]                       (if (= n 0)              ...
(defn part5                     [self]                     (let [f (fn [y] ((self self) y))]                       (almost...
(defn part5                     [self]                     (let [f (fn [y] ((self self) y))]                       (almost...
(defn fact5                     [n]                     ((part5 part5) n))                   (def fact6                   ...
(defn fact5                     [n]                     ((part5 part5) n))                   (def fact6                   ...
(def fact6                     (let [part (fn [self]                                  (let [f (fn [y] ((self self) y))]   ...
(def fact6                       (let [part (fn [self]                                    (let [f (fn [y] ((self self) y))...
(def fact7                     (let [x (fn [x]                               (let [f (fn [y] ((x x) y))]                  ...
(def fact7                     (let [x (fn [x]                               (let [f (fn [y] ((x x) y))]                  ...
(def fact8                     ((fn [x]                        (x x)) (fn [x]                                 (let [f (fn ...
(def fact8                     ((fn [x]                        (x x)) (fn [x]                                 (let [f (fn ...
(defn nearly-Y                     [g]                     ((fn [x] (x x)) (fn [x]                                      (l...
(defn nearly-Y                     [g]                     ((fn [x] (x x)) (fn [x]                                      (l...
(defn Y                     [g]                     ((fn [x] (x x)) (fn [x]                                      (g (fn [y...
(defn Y                     [g]                     ((fn [x] (x x)) (fn [x]                                      (g (fn [y...
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]                                       ;...
(defn almost-factorial            (Y almost-factorial)         [f]         (fn [n]                                       ;...
(defn almost-factorial            (Y almost-factorial)         [f]         (fn [n]                                       ;...
(defn almost-factorial                 (Y almost-factorial)         [f]         (fn [n]                                   ...
(defn almost-factorial        [f]        (fn [n]          (if (= n 0)                1                (* n (f (dec n))))))...
(defn almost-factorial        [f]        (fn [n]          (if (= n 0)                1                (* n (f (dec n))))))...
(defn almost-factorial        [f]        (fn [n]          (if (= n 0)                1                      ONE           ...
(defn almost-factorial        [f]        (fn [n]          (if (= n 0)                        ANY                1         ...
Upcoming SlideShare
Loading in...5
×

OUDL Y Combinator

328

Published on

A brief intro to the Y Combinator, using Clojure.

Published in: Technology, Self Improvement
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
328
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "OUDL Y Combinator"

  1. 1. We are OUDL. Organization for the Understanding of Dynamic Languages http://meetup.com/dynamic/Wednesday, August 22, 12We are programming language enthusiastsCheck us out on Meetup.comAll events have been by members, for membersEach event has a theme, a selected pastry or baked good, and a horrible logo
  2. 2. What makes Objective C dynamic?Wednesday, August 22, 12
  3. 3. What makes Objective C dynamic? Kamehameha Bakery donuts Otto Cake cheesecake Cake Couture cupcakes Fendu Bakery croissants & cookies Saint Germain Bakery palmiersWednesday, August 22, 12
  4. 4. Mahalo.Wednesday, August 22, 12
  5. 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 ChocolatWednesday, August 22, 12
  6. 6. Not this one.Wednesday, August 22, 12Paul Graham did name his company after the *REAL* Y combinator.But, why?
  7. 7. This one. (defn Y [g] ((fn [x] (x x)) (fn [x] (g (fn [y] ((x x) y))))))Wednesday, August 22, 12Which is this thing, in Clojure.
  8. 8. Let’s get started. Here’s a non-recursive definition of factorial, using the Y combinator.Wednesday, August 22, 12Here it is. Thank you, good night and good luck.
  9. 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, 12Here it is. Thank you, good night and good luck.
  10. 10. Questions?Wednesday, August 22, 12
  11. 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, 12Let’s back up. This is how a sane person would define factorial... recursively.
  12. 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, 12Recursive definition to non-recursive
  13. 13. 2 Things 1) recursion 2) functionsWednesday, August 22, 12
  14. 14. 2 Things 1) recursion 2) functionsWednesday, August 22, 12
  15. 15. “The Y combinator allows recursion recursion... as a set of rewrite rules, without requiring native recursion support in the language.” -- Someone on WikipediaWednesday, August 22, 12
  16. 16. replace “native recursion” with manual recursionWednesday, August 22, 12
  17. 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. 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. 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. 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. 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=4Wednesday, August 22, 12
  22. 22. replace “native recursion” with manual recursion “rewrite rules”Wednesday, August 22, 12
  23. 23. 2 Things 1) recursion 2) functionsWednesday, August 22, 12
  24. 24. 2 Things 1) recursion 2) functionsWednesday, August 22, 12
  25. 25. Functions are machines. Functions are relationships, between inputs and outputs.Wednesday, August 22, 12
  26. 26. A function is a blender.Wednesday, August 22, 12
  27. 27. FIRST ORDER BLENDER A normal blender that consumes single input and creates output.Wednesday, August 22, 12
  28. 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. 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
  30. 30. ONEWednesday, August 22, 12
  31. 31. ONE (defn almost-factorial [f] (fn [n] (if (= n 0) 1 (* n (f (dec n))))))Wednesday, August 22, 12
  32. 32. ONE ANY (defn almost-factorial [f] (fn [n] (if (= n 0) 1 (* n (f (dec n))))))Wednesday, August 22, 12
  33. 33. ONE ANY Y (defn almost-factorial [f] factorial (fn [n] (if (= n 0) 1 (* n (f (dec n))))))Wednesday, August 22, 12
  34. 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, 12Derivation not possible in 3 minutes.
  35. 35. I’m so sorry. No kittens were blended during the creation of this presentation.Wednesday, August 22, 12
  36. 36. No really, done now. No kittens were blended during the creation of this presentation.Wednesday, August 22, 12
  37. 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) => 8Wednesday, August 22, 121) First, a primer on LISP & Clojure- parens for function call- prefix notation, followed by arguments2) And, function definition and anonymous functions
  38. 38. (defn simple-factorial [n] (if (= n 0) 1 (* n (simple-factorial (dec n)))))Wednesday, August 22, 12Here, we remove the recursive definition. Kind of delaying it, for now.
  39. 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) => 120Wednesday, August 22, 12Here, we remove the recursive definition. Kind of delaying it, for now.
  40. 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) => 120Wednesday, August 22, 12Change part to take a single arg, returning a function that takes n.
  41. 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) => 120Wednesday, August 22, 12Change part to take a single arg, returning a function that takes n.
  42. 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) => 120Wednesday, August 22, 12Replace (self self) with f, which blows up in a Stack Overflow... but, we press on.
  43. 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, 12Replace (self self) with f, which blows up in a Stack Overflow... but, we press on.
  44. 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, 12Bury, the (self self) call in a lambda.
  45. 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, 12Bury, the (self self) call in a lambda.
  46. 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, 12Rip out the function that looks almost like the factorial function. This is what we’regeneralizing. The Y combinator computes the fixpoint of this function.
  47. 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, 12Rip out the function that looks almost like the factorial function. This is what we’regeneralizing. The Y combinator computes the fixpoint of this function.
  48. 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, 12Insert almost-factorial into the part function.
  49. 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, 12Insert almost-factorial into the part function.
  50. 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, 12fact5 is a working factorial function, but we can generalize it
  51. 51. (defn part5 [self] (let [f (fn [y] ((self self) y))] (almost-factorial f))) (defn fact5 [n] ((part5 part5) n))Wednesday, August 22, 12fact5 is a working factorial function, but we can generalize it
  52. 52. (defn part5 [self] (let [f (fn [y] ((self self) y))] (almost-factorial f))) (defn fact5 [n] ((part5 part5) n))Wednesday, August 22, 12here we embed the definition the “part” function
  53. 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, 12here we embed the definition the “part” function
  54. 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, 12rename part => xand self => xfor kicks really
  55. 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, 12rename part => xand self => xfor kicks really
  56. 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, 12replace the (x x) invocation with a lambda of the same
  57. 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, 12replace the (x x) invocation with a lambda of the same
  58. 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, 12Rename to Yand generalize, by accepting a function g and using this to replace almost-factorial
  59. 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, 12Rename to Yand generalize, by accepting a function g and using this to replace almost-factorial
  60. 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, 12Replace f with the anonymous function bound to it
  61. 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, 12Replace f with the anonymous function bound to it
  62. 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. 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. 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. 65. I’m so sorry. No kittens were blended during the creation of this presentation.Wednesday, August 22, 12
  66. 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. 67. (defn almost-factorial (Y almost-factorial) [f] (fn [n] ;; ((Y almost-factorial) 5) => 120 (if (= n 0) 1 (* n (f (dec n)))))) YWednesday, August 22, 12
  68. 68. (defn almost-factorial (Y almost-factorial) [f] (fn [n] ;; ((Y almost-factorial) 5) => 120 (if (= n 0) 1 (* n (f (dec n)))))) Y FACTORIALWednesday, August 22, 12
  69. 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 FACTORIALWednesday, August 22, 12
  70. 70. (defn almost-factorial [f] (fn [n] (if (= n 0) 1 (* n (f (dec n)))))) Y factorialWednesday, August 22, 12
  71. 71. (defn almost-factorial [f] (fn [n] (if (= n 0) 1 (* n (f (dec n)))))) Y factorialWednesday, August 22, 12
  72. 72. (defn almost-factorial [f] (fn [n] (if (= n 0) 1 ONE (* n (f (dec n)))))) Y factorialWednesday, August 22, 12
  73. 73. (defn almost-factorial [f] (fn [n] (if (= n 0) ANY 1 ONE (* n (f (dec n)))))) Y factorialWednesday, August 22, 12
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×