Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Reorganize 2008 and 2009 into new structure. #45

Closed
wants to merge 1 commit into from

2 participants

@Dignifiedquire

This makes it easier to find all new files, because one doesn't have to scroll so much until you reach the 2013 folder.

@raganwald
Collaborator

Thank for your efforts, I appreciate your thoughtfulness. I've considered this many times, the original organization method is not helpful. Alas, however, the Internet has links to the original files that should not be broken by moving them.

@raganwald raganwald closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Mar 30, 2013
  1. @Dignifiedquire
This page is out of date. Refresh to see the latest.
Showing with 0 additions and 489 deletions.
  1. +0 −48 2008-11-23/recursive_combinators.rb
  2. +0 −67 2008-11-26/string_to_proc.rb
  3. +0 −1  2008-12-1/anonymous_module.rb
  4. +0 −373 2008-12-1/keep_your_privates_to_yourself.md
  5. 0  {2008-10-28 → 2008/10}/and_and_or.markdown
  6. 0  {2008-10-31 → 2008/10}/cardinal.rb
  7. 0  {2008-10-29 → 2008/10}/inside.rb
  8. 0  {2008-10-30 → 2008/10}/into.rb
  9. 0  {2008-10-29 → 2008/10}/kestrel.markdown
  10. 0  {2008-10-30 → 2008/10}/let.rb
  11. 0  {2008-10-31 → 2008/10}/songs_of_the_cardinal.markdown
  12. 0  {2008-10-30 → 2008/10}/thrush.markdown
  13. 0  {2008-10-27 → 2008/10}/unfold.markdown
  14. 0  {2008-10-27 → 2008/10}/unfold.rb
  15. 0  {2008-10-30 → 2008/10}/why_im_using_git.markdown
  16. 0  {2008-10-29 → 2008/10}/you_keep_using_that_idiom.markdown
  17. 0  {2008-11-07 → 2008/11}/README.md
  18. 0  {2008-11-12 → 2008/11}/andand.rb
  19. 0  {2008-11-07 → 2008/11}/before_and_after_advice.rb
  20. 0  {2008-11-07 → 2008/11}/before_and_after_advice_spec.rb
  21. 0  {2008-11-04 → 2008/11}/blank_slate.rb
  22. 0  {2008-11-21 → 2008/11}/cdr.md
  23. 0  {2008-11-12 → 2008/11}/combinator_chemistry.md
  24. 0  {2008-11-07 → 2008/11}/comment_on_implementing_advice.markdown
  25. 0  {2008-11-23 → 2008/11}/divide_and_conquer.rb
  26. 0  {2008-11-21 → 2008/11}/divide_and_conquer_helper.rb
  27. 0  {2008-11-21 → 2008/11}/double_mockingbird.rb
  28. 0  {2008-11-07 → 2008/11}/from_birds_that_compose_to_method_advice.markdown
  29. 0  {2008-11-16 → 2008/11}/joy.md
  30. 0  {2008-11-26 → 2008/11}/legacy_recursive_combinators.rb
  31. 0  {2008-11-23 → 2008/11}/linear_recursion.rb
  32. 0  {2008-11-23 → 2008/11}/merge_sort.rb
  33. 0  {2008-11-07 → 2008/11}/naive_before_advice.rb
  34. 0  {2008-11-26 → 2008/11}/old_merge_sort.rb
  35. 0  {2008-11-26 → 2008/11}/partial_application_recursive_combinators.rb
  36. 0  {2008-11-26 → 2008/11}/practical_recursive_combinators.md
  37. 0  {2008-11-26 → 2008/11}/practicum.rb
  38. 0  {2008-11-09 → 2008/11}/proc_arity.markdown
  39. 0  {2008-11-04 → 2008/11}/quirky_bird.rb
  40. 0  {2008-11-04 → 2008/11}/quirky_birds_and_meta_syntactic_programming.markdown
  41. 0  {2008-11-04 → 2008/11}/quirky_songs.rb
  42. 0  {2008-11-23 → 2008/11}/recursive_combinators.md
  43. 0  {2008-11-26 → 2008/11}/recursive_combinators.rb
  44. 0  {2008-11-04 → 2008/11}/returning.rb
  45. 0  {2008-11-23 → 2008/11}/rotate.rb
  46. 0  {2008-11-28 → 2008/11}/string_to_proc.rb
  47. 0  {2008-11-23 → 2008/11}/sum_squares.rb
  48. 0  {2008-11-21 → 2008/11}/template_method.rb
  49. 0  {2008-11-21 → 2008/11}/templates_double_mockingbirds_and_helpers.md
  50. 0  {2008-11-12 → 2008/11}/the_obdurate_kestrel.md
  51. 0  {2008-11-04 → 2008/11}/unary_ampersand_in_ruby.markdown
  52. 0  {2008-11-03 → 2008/11}/with_unhygienic_and_call-by-name_semantics_in_rewrite.markdown
  53. 0  {2008-11-28 → 2008/11}/you_cant_be_serious.md
  54. 0  {2008-12-01 → 2008/12}/anonymous_module.rb
  55. 0  {2008-12-17 → 2008/12}/another_fibonacci.md
  56. 0  {2008-12-17 → 2008/12}/another_fibonacci.rb
  57. 0  {2008-12-23 → 2008/12}/bah_humbug.md
  58. 0  {2008-12-18 → 2008/12}/called_by_name.md
  59. 0  {2008-12-12 → 2008/12}/fibonacci.md
  60. 0  {2008-12-12 → 2008/12}/fibonacci.rb
  61. 0  {2008-12-01 → 2008/12}/keep_your_privates_to_yourself.md
  62. 0  {2008-12-09 → 2008/12}/nuno_job_on_rewrite.md
  63. 0  {2008-12-03 → 2008/12}/proc_rcall.rb
  64. 0  {2008-12-03 → 2008/12}/rcall.md
  65. 0  {2008-12-16 → 2008/12}/welcome.md
  66. 0  {2009-01-14 → 2009/01}/advertisement.md
  67. 0  {2009-01-05 → 2009/01}/andand_even_more.md
  68. 0  {2009-01-02 → 2009/01}/flight_of_the_phoenix.md
  69. 0  {2009-01-13 → 2009/01}/maybe.md
  70. 0  {2009-01-12 → 2009/01}/mundane.md
  71. 0  {2009-01-21 → 2009/01}/old.md
  72. 0  {2009-01-06 → 2009/01}/rewrite_rails.md
  73. 0  {2009-02-12 → 2009/02}/a_question.md
  74. 0  {2009-02-02 → 2009/02}/hopeless_egocentricity.md
  75. 0  {2009-02-16 → 2009/02}/vilfredo_federico_damaso_pareto.md
  76. 0  {2009-03-12 → 2009/03}/another_question.md
  77. 0  {2009-03-03 → 2009/03}/circular.md
  78. 0  {2009-03-07 → 2009/03}/number.rb
  79. 0  {2009-03-07 → 2009/03}/surreal.md
  80. 0  {2009-04-17 → 2009/04}/eggs.md
  81. 0  {2009-04-28 → 2009/04}/extension_methods.md
  82. 0  {2009-04-15 → 2009/04}/keywords.md
  83. 0  {2009-04-09 → 2009/04}/my_objection_to_sum.md
  84. 0  {2009-04-28 → 2009/04}/rumpole.jpg
  85. 0  {2009-04-08 → 2009/04}/sick.md
  86. 0  {2009-05-20 → 2009/05}/all_yall.rb
  87. 0  {2009-05-01 → 2009/05}/optimism.md
  88. 0  {2009-05-25 → 2009/05}/rubyjobfair.md
  89. 0  {2009-05-20 → 2009/05}/surprising.md
  90. 0  {2009-05-13 → 2009/05}/tough_crowd.md
  91. 0  {2009-06-02 → 2009/06}/functional_complexity.md
  92. 0  {2009-06-26 → 2009/06}/no_hire.md
  93. 0  {2009-06-05 → 2009/06}/tsttcpw.md
  94. 0  {2009-06-05 → 2009/06}/tsttcpw.rb
  95. 0  {2009-06-29 → 2009/06}/wrapping_combinators.md
  96. 0  {2009-08-29 → 2009/08}/returning.md
  97. 0  {2009-09-22 → 2009/09}/anaphora.md
  98. 0  {2009-10-20 → 2009/10}/high_anxiety.md
  99. 0  {2009-10-08 → 2009/10}/metalinguistic.md
  100. 0  {2009-10-08 → 2009/10}/no_hire.md
  101. 0  {2009-12-09 → 2009/12}/block_styling.markdown
  102. 0  {2009-12-04 → 2009/12}/kestrels_on_rails.md
View
48 2008-11-23/recursive_combinators.rb
@@ -1,48 +0,0 @@
-# The MIT License
-#
-# All contents Copyright (c) 2004-2008 Reginald Braithwaite
-# <http://braythwayt.com> except as otherwise noted.
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above Copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-#
-# http://www.opensource.org/licenses/mit-license.php
-
-def divide_and_conquer(value, steps)
- if steps[:divisible?].call(value)
- steps[:recombine].call(
- steps[:divide].call(value).map { |sub_value| divide_and_conquer(sub_value, steps) }
- )
- else
- steps[:conquer].call(value)
- end
-end
-
-def linear_recursion(value, steps)
- if steps[:divisible?].call(value)
- trivial_part, sub_problem = steps[:divide].call(value)
- steps[:recombine].call(
- trivial_part, linear_recursion(sub_problem, steps)
- )
- else
- steps[:conquer].call(value)
- end
-end
-
-alias :multirec :divide_and_conquer
-alias :linrec :linear_recursion
View
67 2008-11-26/string_to_proc.rb
@@ -1,67 +0,0 @@
-# The MIT License
-#
-# Copyright (c) 2004-2008 Reginald Braithwaite
-# Portions Copyright (c) 2006 Oliver Steele
-# <http://braythwayt.com> except as otherwise noted.
-#
-# See http://raganwald.com/2007/10/stringtoproc.html
-#
-# Ported from the String Lambdas in Oliver Steele's Functional JavaScript
-# http://osteele.com/sources/javascript/functional/
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above Copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-#
-# http://www.opensource.org/licenses/mit-license.php
-
-class String
- unless ''.respond_to?(:to_proc)
- def to_proc &block
- params = []
- expr = self
- sections = expr.split(/\s*->\s*/m)
- if sections.length > 1 then
- eval sections.reverse!.inject { |e, p| "(Proc.new { |#{p.split(/\s/).join(', ')}| #{e} })" }, block && block.binding
- elsif expr.match(/\b_\b/)
- eval "Proc.new { |_| #{expr} }", block && block.binding
- else
- leftSection = expr.match(/^\s*(?:[+*\/%&|\^\.=<>\[]|!=)/m)
- rightSection = expr.match(/[+\-*\/%&|\^\.=<>!]\s*$/m)
- if leftSection || rightSection then
- if (leftSection) then
- params.push('$left')
- expr = '$left' + expr
- end
- if (rightSection) then
- params.push('$right')
- expr = expr + '$right'
- end
- else
- self.gsub(
- /(?:\b[A-Z]|\.[a-zA-Z_$])[a-zA-Z_$\d]*|[a-zA-Z_$][a-zA-Z_$\d]*:|self|arguments|'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"/, ''
- ).scan(
- /([a-z_$][a-z_$\d]*)/i
- ) do |v|
- params.push(v) unless params.include?(v)
- end
- end
- eval "Proc.new { |#{params.join(', ')}| #{expr} }", block && block.binding
- end
- end
- end
-end
View
1  2008-12-1/anonymous_module.rb
@@ -1 +0,0 @@
-# This item was incorrectly categorized. Please update links and bookmarks to http://github.com/raganwald/homoiconic/tree/master/2008-12-01/anonymous_module.rb
View
373 2008-12-1/keep_your_privates_to_yourself.md
@@ -1,373 +0,0 @@
-*This item was incorrectly categorized. Please update links and bookmarks to:* [http://github.com/raganwald/homoiconic/tree/master/2008-12-01/keep\_your\_privates\_to\_yourself.md](http://github.com/raganwald/homoiconic/tree/master/2008-12-01/keep_your_privates_to_yourself.md#readme)
-
----
-
-Keep Your Privates To Yourself
-===
-
-> Wherein we examine a way to break large classes into private modules and furthermore find a way to make methods private to a module and not to its downstream dependents.
-
-Problem Statement: Subdividing a Class
----
-
-In some architectures, model classes are extremely heavyweight. This is especially the case with database-backed models in legacy schema. Sometimes, the pain of refactoring and migrating the database is so large that developers are reluctant to institute [small classes and short methods](http://binstock.blogspot.com/2008/04/perfecting-oos-small-classes-and-short.html "Perfecting OO's Small Classes and Short Methods").
-
-Scope is an issue: if you break subclasses `C1`, `C1`, and `C3` out of class `C`, you may not actually want `C1`, `C1`, and `C3` to be part of the global scope. You can embed them in `C`, but now `C::C1`, `C::C2`, and `C::C3` are part of `C`'s API. The exact same reasoning holds for breaking functionality out into modules `M1`, `M2`, and `M3`: You don't want them to be part of global scope, nor do you want `C::M1`, `C::M2`, and `C::M3` to be part of `C`'s API.
-
-What we want is to be able to create a 'private' subdivision of a class, such as a module that is private to a class.
-
-No Embedded Modules
----
-
- class Foo
-
- module Bar
- def bar
- 'bar'
- end
- end
-
- include Bar
-
- end
-
- class Fizz
-
- include Foo::Bar
-
- end
-
- Fizz.new.bar
- => 'bar
-
-As mentioned above, simply embedding `Bar` in `Foo` does not make it private, it is part of `Foo`'s API. When you write this code, you are telling every developer they are free to use `Foo::Bar`. We'll have to try something else.
-
-Modules Can't Be Private
----
-
- class Foo
-
- private
-
- module Bar
- def bar
- 'bar'
- end
- end
-
- include Bar
-
- end
-
- obj = Object.new
- obj.extend Foo::Bar
- obj.bar
-
- => 'bar
-
-Nogoodnik, the `private` keyword does not apply to modules.
-
-Solution: Anonymous Modules
----
-
- class Foo
-
- include(Module.new do
- def bar
- 'bar'
- end
- end)
-
- end
-
- Foo.new.bar
- => 'bar'
- Foo.ancestors
- => [Foo, #<Module:0x213cc>, Object, Kernel]
-
-This works. if we want to group several methods and declarations together, we can create an anonymous module inside of a class. It is one of `Foo`'s ancestors, but it is not part of `Foo`'s API. Now we have a recipe for breaking classes into private parts.
-
-If you find `include(Module.new do...end)` looks awkward, we can fix that:
-
- class Module
-
- def anonymous_module(&block)
- self.send :include, Module.new(&block)
- end
-
- end
-
- class Acronym
-
- anonymous_module do
-
- def fubar
- 'fubar'
- end
-
- def snafu
- 'snafu'
- end
-
- end
-
- end
-
-More about Anonymous Modules
----
-
-The recipe for creating anonymous modules within a class is useful for breaking large classes up into chunks of related methods. However, all methods within those anonymous modules are mixed into the base class. Consider the case where you have two related methods, `fubar` and `snafu`:
-
- class Acronym
-
- include(Module.new do
-
- def fubar
- 'fu' + 'bar'
- end
-
- def snafu
- 'sna' + 'fu'
- end
-
- end)
-
- end
-
- Acronym.instance_methods - Object.instance_methods
- => ["fubar", "snafu"]
-
-Let's [extract a helper method](http://www.refactoring.com/catalog/extractMethod.html "Refactoring:
-Extract Method"):
-
- class Acronym
-
- include(Module.new do
-
- def fubar
- fu() + 'bar'
- end
-
- def snafu
- 'sna' + fu()
- end
-
- private
-
- def fu
- 'fu'
- end
-
- end)
-
- def arnie_sez
- fu() + ', _'
- end
-
- end
-
- Acronym.instance_methods - Object.instance_methods
- => ["fubar", "snafu"]
- Acronym.new.arnie_sez
- => "fu, _"
-
-As you can see, you can declare private methods in a module (whether anonymous or not), and those methods remain private. However, they are mixed into the class just as the public methods are mixed into the class. Which means they are part of `Acronym`'s *internal* API.
-
-New Problem Statement: Private Helpers
----
-
-What we now want is a way to create functionality that is private inside of a module. So the methods that are mixed into a class can use it, but no other methods from the class can use it. That way, it is 100% clear that the functionality is strictly for the methods in the module.
-
-Solution: Closures and `define_method`
----
-
-One way to accomplish this is to eschew the `def` keyword and use `define_method` with a block. That works because the block is a closure and has access to the local variables in the environment where it was created, while the body of a `def` keyword does not:
-
- class Acronym
-
- include(Module.new do
-
- fu = lambda do
- 'fu'
- end
-
- define_method :fubar do
- fu.call + 'bar'
- end
-
- define_method :snafu do
- 'sna' + fu.call
- end
-
- end)
-
- def arnie_sez
- fu.call + ', _'
- end
-
- end
-
- p Acronym.new.snafu
- => "snafu"
- p Acronym.new.arnie_sez
- => NameError: undefined local variable or method ‘fu’ for #<Acronym:0x20d64>
-
-If `fu` was not already bound to a local variable, it ceases to exist after the module definition is complete. Even if it was, `#arnie_sez` is defined using the `def` keyword, and the body of a method defined with `def` cannot access local variables from the environment of the class' definition. (If you try really hard, you can take advantage of a known problem that is fixed in Ruby 1.9 to break this in Ruby 1.8, but that is not a fatal flaw).
-
-Another use for closures in an anonymous module
----
-
-What if you would like to create a class variable that should be "local" to a module because it is only used by a method or methods in the module:
-
- class Acronym
-
- anonymous_module do
-
- def fubar
- @@effed_up ||= 0
- @@effed_up += 1
- "You effed up #{@@effed_up} times"
- end
-
- end
-
- end
-
- Acronym.new.fubar
- => "You effed up 1 times"
- Acronym.new.fubar
- => "You effed up 2 times"
- Acronym.new.fubar
- => "You effed up 3 times"
-
-What happens when another method in the `Acronym` class wants to use `@@effed_up`?
-
- class Acronym
-
- def snafu
- @@effed_up ||= 0
- @@effed_up += 1
- "You effed up #{@@effed_up} times"
- end
-
- end
-
- Acronym.new.snafu
- => "You effed up 4 times"
-
-It seems that class variables are not private to a module. However, we can use local variables and closures for more than just lambdas:
-
- class Acronym
-
- anonymous_module do
-
- effed_up = 0
-
- define_method :fubar do
- effed_up += 1
- "You effed up #{effed_up} times"
- end
-
- end
-
- end
-
- Acronym.new.fubar
- => "You effed up 1 times"
- Acronym.new.fubar
- => "You effed up 2 times"
- Acronym.new.fubar
- => "You effed up 3 times"
-
-You can use local variables and `define_method` to create the effect of class variables that are strictly local to the module and private from other methods in the class.
-
-Problem Statement: Organizing Large Methods
----
-
-Quite often you need to break a method up into smaller methods. The traditional procedural solution are private helper methods:
-
- class Acronym
-
- def fubar
- fu() + bar()
- end
-
- private
-
- def fu
- 'fu'
- end
-
- def bar
- 'bar'
- end
-
- end
-
- Acronym.new.fubar
- => "fubar"
-
-But as we saw above, it is not obvious that the `#fu` and `#bar` methods are really private to `#fubar` and not meant to be used by any method in the `Acronym` class.
-
-Local lambdas create extra objects
----
-
-One approach is to create lambdas local to a method:
-
- class Acronym
-
- def fubar
- fu = lambda { 'fu' }
- bar = lambda { 'bar' }
- fu.call + bar.call
- end
-
- end
-
-This makes it very clear that they are not to be used elsewhere. However, you are creating new lambdas every time you call `#fubar`. This probably doesn't matter, however no matter how insignificant the time or memory overhead relative to database queries and the rest of the method, it is difficult to get such code through an inspection without someone trying to score points off you by complaining about the 'excessive' object creation.
-
-Also, you may be accused of having learned programming back when Borland Pascal was all the rage. Nested procedures are very Lisp and Pascal. You would think that being Lisp-like is a good thing in a language its creator nicknamed "MatzLisp," but you will often find the real world of Ruby programmers surprising.
-
-So performance and preserving your reputation are not at risk, this is another solution suitable for the case where the helper is only used by one method. If creating the extra lambdas is inappropriate, you can fall back to the solution given above:
-
- class Acronym
-
- include(Module.new do
-
- fu = lambda { 'fu' }
- bar = lambda { 'bar' }
-
- define_method :fubar do
- fu.call + bar.call
- end
-
- end)
-
- end
-
-Conclusion and a Tip
----
-
-In conclusion, for those times you do not want to break a class into completely separate modules and classes, you can use anonymous modules to subdivide a class without extending its API. Within an anonymous module, you can use `define_method`, lambdas, and local variables to create helpers that are truly private to the module. This is handy for behaviour shared by methods in the module or for making helpers for a single method.
-
-And a tip: *Using local variables and `define_method` to create private helpers and variables local to a module is not restricted to anonymous modules, you can use it with any module you like.*
-
-* [anonymous\_method.rb](http://github.com/raganwald/homoiconic/tree/master/2008-12-01/anonymous_method.rb)
-* An example of this recipe in action: The `separate_args` lambda from [recursive\_combinators.rb](http://github.com/raganwald/homoiconic/tree/master/2008-11-26/recursive_combinators.rb)
-
----
-
-My recent work:
-
-![](http://i.minus.com/iL337yTdgFj7.png)[![JavaScript Allongé](http://i.minus.com/iW2E1A8M5UWe6.jpeg)](http://leanpub.com/javascript-allonge "JavaScript Allongé")![](http://i.minus.com/iL337yTdgFj7.png)[![CoffeeScript Ristretto](http://i.minus.com/iMmGxzIZkHSLD.jpeg)](http://leanpub.com/coffeescript-ristretto "CoffeeScript Ristretto")![](http://i.minus.com/iL337yTdgFj7.png)[![Kestrels, Quirky Birds, and Hopeless Egocentricity](http://i.minus.com/ibw1f1ARQ4bhi1.jpeg)](http://leanpub.com/combinators "Kestrels, Quirky Birds, and Hopeless Egocentricity")
-
-* [JavaScript Allongé](http://leanpub.com/javascript-allonge), [CoffeeScript Ristretto](http://leanpub.com/coffeescript-ristretto), and my [other books](http://leanpub.com/u/raganwald).
-* [allong.es](http://allong.es), practical function combinators and decorators for JavaScript.
-* [Method Combinators](https://github.com/raganwald/method-combinators), a CoffeeScript/JavaScript library for writing method decorators, simply and easily.
-* [jQuery Combinators](http://github.com/raganwald/jquery-combinators), what else? A jQuery plugin for writing your own fluent, jQuery-like code.
-
----
-
-(Spot a bug or a spelling mistake? This is a Github repo, fork it and send me a pull request!)
-
-[Reg Braithwaite](http://braythwayt.com) | [@raganwald](http://twitter.com/raganwald)
View
0  2008-10-28/and_and_or.markdown → 2008/10/and_and_or.markdown
File renamed without changes
View
0  2008-10-31/cardinal.rb → 2008/10/cardinal.rb
File renamed without changes
View
0  2008-10-29/inside.rb → 2008/10/inside.rb
File renamed without changes
View
0  2008-10-30/into.rb → 2008/10/into.rb
File renamed without changes
View
0  2008-10-29/kestrel.markdown → 2008/10/kestrel.markdown
File renamed without changes
View
0  2008-10-30/let.rb → 2008/10/let.rb
File renamed without changes
View
0  2008-10-31/songs_of_the_cardinal.markdown → 2008/10/songs_of_the_cardinal.markdown
File renamed without changes
View
0  2008-10-30/thrush.markdown → 2008/10/thrush.markdown
File renamed without changes
View
0  2008-10-27/unfold.markdown → 2008/10/unfold.markdown
File renamed without changes
View
0  2008-10-27/unfold.rb → 2008/10/unfold.rb
File renamed without changes
View
0  2008-10-30/why_im_using_git.markdown → 2008/10/why_im_using_git.markdown
File renamed without changes
View
0  2008-10-29/you_keep_using_that_idiom.markdown → 2008/10/you_keep_using_that_idiom.markdown
File renamed without changes
View
0  2008-11-07/README.md → 2008/11/README.md
File renamed without changes
View
0  2008-11-12/andand.rb → 2008/11/andand.rb
File renamed without changes
View
0  2008-11-07/before_and_after_advice.rb → 2008/11/before_and_after_advice.rb
File renamed without changes
View
0  2008-11-07/before_and_after_advice_spec.rb → 2008/11/before_and_after_advice_spec.rb
File renamed without changes
View
0  2008-11-04/blank_slate.rb → 2008/11/blank_slate.rb
File renamed without changes
View
0  2008-11-21/cdr.md → 2008/11/cdr.md
File renamed without changes
View
0  2008-11-12/combinator_chemistry.md → 2008/11/combinator_chemistry.md
File renamed without changes
View
0  2008-11-07/comment_on_implementing_advice.markdown → 2008/11/comment_on_implementing_advice.markdown
File renamed without changes
View
0  2008-11-23/divide_and_conquer.rb → 2008/11/divide_and_conquer.rb
File renamed without changes
View
0  2008-11-21/divide_and_conquer_helper.rb → 2008/11/divide_and_conquer_helper.rb
File renamed without changes
View
0  2008-11-21/double_mockingbird.rb → 2008/11/double_mockingbird.rb
File renamed without changes
View
0  ...from_birds_that_compose_to_method_advice.markdown → ...from_birds_that_compose_to_method_advice.markdown
File renamed without changes
View
0  2008-11-16/joy.md → 2008/11/joy.md
File renamed without changes
View
0  2008-11-26/legacy_recursive_combinators.rb → 2008/11/legacy_recursive_combinators.rb
File renamed without changes
View
0  2008-11-23/linear_recursion.rb → 2008/11/linear_recursion.rb
File renamed without changes
View
0  2008-11-23/merge_sort.rb → 2008/11/merge_sort.rb
File renamed without changes
View
0  2008-11-07/naive_before_advice.rb → 2008/11/naive_before_advice.rb
File renamed without changes
View
0  2008-11-26/old_merge_sort.rb → 2008/11/old_merge_sort.rb
File renamed without changes
View
0  ...1-26/partial_application_recursive_combinators.rb → 2008/11/partial_application_recursive_combinators.rb
File renamed without changes
View
0  2008-11-26/practical_recursive_combinators.md → 2008/11/practical_recursive_combinators.md
File renamed without changes
View
0  2008-11-26/practicum.rb → 2008/11/practicum.rb
File renamed without changes
View
0  2008-11-09/proc_arity.markdown → 2008/11/proc_arity.markdown
File renamed without changes
View
0  2008-11-04/quirky_bird.rb → 2008/11/quirky_bird.rb
File renamed without changes
View
0  ...rky_birds_and_meta_syntactic_programming.markdown → ...rky_birds_and_meta_syntactic_programming.markdown
File renamed without changes
View
0  2008-11-04/quirky_songs.rb → 2008/11/quirky_songs.rb
File renamed without changes
View
0  2008-11-23/recursive_combinators.md → 2008/11/recursive_combinators.md
File renamed without changes
View
0  2008-11-26/recursive_combinators.rb → 2008/11/recursive_combinators.rb
File renamed without changes
View
0  2008-11-04/returning.rb → 2008/11/returning.rb
File renamed without changes
View
0  2008-11-23/rotate.rb → 2008/11/rotate.rb
File renamed without changes
View
0  2008-11-28/string_to_proc.rb → 2008/11/string_to_proc.rb
File renamed without changes
View
0  2008-11-23/sum_squares.rb → 2008/11/sum_squares.rb
File renamed without changes
View
0  2008-11-21/template_method.rb → 2008/11/template_method.rb
File renamed without changes
View
0  ...1-21/templates_double_mockingbirds_and_helpers.md → 2008/11/templates_double_mockingbirds_and_helpers.md
File renamed without changes
View
0  2008-11-12/the_obdurate_kestrel.md → 2008/11/the_obdurate_kestrel.md
File renamed without changes
View
0  2008-11-04/unary_ampersand_in_ruby.markdown → 2008/11/unary_ampersand_in_ruby.markdown
File renamed without changes
View
0  ...ic_and_call-by-name_semantics_in_rewrite.markdown → ...ic_and_call-by-name_semantics_in_rewrite.markdown
File renamed without changes
View
0  2008-11-28/you_cant_be_serious.md → 2008/11/you_cant_be_serious.md
File renamed without changes
View
0  2008-12-01/anonymous_module.rb → 2008/12/anonymous_module.rb
File renamed without changes
View
0  2008-12-17/another_fibonacci.md → 2008/12/another_fibonacci.md
File renamed without changes
View
0  2008-12-17/another_fibonacci.rb → 2008/12/another_fibonacci.rb
File renamed without changes
View
0  2008-12-23/bah_humbug.md → 2008/12/bah_humbug.md
File renamed without changes
View
0  2008-12-18/called_by_name.md → 2008/12/called_by_name.md
File renamed without changes
View
0  2008-12-12/fibonacci.md → 2008/12/fibonacci.md
File renamed without changes
View
0  2008-12-12/fibonacci.rb → 2008/12/fibonacci.rb
File renamed without changes
View
0  2008-12-01/keep_your_privates_to_yourself.md → 2008/12/keep_your_privates_to_yourself.md
File renamed without changes
View
0  2008-12-09/nuno_job_on_rewrite.md → 2008/12/nuno_job_on_rewrite.md
File renamed without changes
View
0  2008-12-03/proc_rcall.rb → 2008/12/proc_rcall.rb
File renamed without changes
View
0  2008-12-03/rcall.md → 2008/12/rcall.md
File renamed without changes
View
0  2008-12-16/welcome.md → 2008/12/welcome.md
File renamed without changes
View
0  2009-01-14/advertisement.md → 2009/01/advertisement.md
File renamed without changes
View
0  2009-01-05/andand_even_more.md → 2009/01/andand_even_more.md
File renamed without changes
View
0  2009-01-02/flight_of_the_phoenix.md → 2009/01/flight_of_the_phoenix.md
File renamed without changes
View
0  2009-01-13/maybe.md → 2009/01/maybe.md
File renamed without changes
View
0  2009-01-12/mundane.md → 2009/01/mundane.md
File renamed without changes
View
0  2009-01-21/old.md → 2009/01/old.md
File renamed without changes
View
0  2009-01-06/rewrite_rails.md → 2009/01/rewrite_rails.md
File renamed without changes
View
0  2009-02-12/a_question.md → 2009/02/a_question.md
File renamed without changes
View
0  2009-02-02/hopeless_egocentricity.md → 2009/02/hopeless_egocentricity.md
File renamed without changes
View
0  2009-02-16/vilfredo_federico_damaso_pareto.md → 2009/02/vilfredo_federico_damaso_pareto.md
File renamed without changes
View
0  2009-03-12/another_question.md → 2009/03/another_question.md
File renamed without changes
View
0  2009-03-03/circular.md → 2009/03/circular.md
File renamed without changes
View
0  2009-03-07/number.rb → 2009/03/number.rb
File renamed without changes
View
0  2009-03-07/surreal.md → 2009/03/surreal.md
File renamed without changes
View
0  2009-04-17/eggs.md → 2009/04/eggs.md
File renamed without changes
View
0  2009-04-28/extension_methods.md → 2009/04/extension_methods.md
File renamed without changes
View
0  2009-04-15/keywords.md → 2009/04/keywords.md
File renamed without changes
View
0  2009-04-09/my_objection_to_sum.md → 2009/04/my_objection_to_sum.md
File renamed without changes
View
0  2009-04-28/rumpole.jpg → 2009/04/rumpole.jpg
File renamed without changes
View
0  2009-04-08/sick.md → 2009/04/sick.md
File renamed without changes
View
0  2009-05-20/all_yall.rb → 2009/05/all_yall.rb
File renamed without changes
View
0  2009-05-01/optimism.md → 2009/05/optimism.md
File renamed without changes
View
0  2009-05-25/rubyjobfair.md → 2009/05/rubyjobfair.md
File renamed without changes
View
0  2009-05-20/surprising.md → 2009/05/surprising.md
File renamed without changes
View
0  2009-05-13/tough_crowd.md → 2009/05/tough_crowd.md
File renamed without changes
View
0  2009-06-02/functional_complexity.md → 2009/06/functional_complexity.md
File renamed without changes
View
0  2009-06-26/no_hire.md → 2009/06/no_hire.md
File renamed without changes
View
0  2009-06-05/tsttcpw.md → 2009/06/tsttcpw.md
File renamed without changes
View
0  2009-06-05/tsttcpw.rb → 2009/06/tsttcpw.rb
File renamed without changes
View
0  2009-06-29/wrapping_combinators.md → 2009/06/wrapping_combinators.md
File renamed without changes
View
0  2009-08-29/returning.md → 2009/08/returning.md
File renamed without changes
View
0  2009-09-22/anaphora.md → 2009/09/anaphora.md
File renamed without changes
View
0  2009-10-20/high_anxiety.md → 2009/10/high_anxiety.md
File renamed without changes
View
0  2009-10-08/metalinguistic.md → 2009/10/metalinguistic.md
File renamed without changes
View
0  2009-10-08/no_hire.md → 2009/10/no_hire.md
File renamed without changes
View
0  2009-12-09/block_styling.markdown → 2009/12/block_styling.markdown
File renamed without changes
View
0  2009-12-04/kestrels_on_rails.md → 2009/12/kestrels_on_rails.md
File renamed without changes
Something went wrong with that request. Please try again.