# How to use exported files in lamb: # # [Syntax Highlighting] # Most languages' syntax highlighters will # highlight this code well. Set it manually # in your editor. # # Don't use a language for which you have a # linter installed, you'll get lots of errors. # # Choose a language you don't have extenstions for, # and a language that uses # comments. # # The following worked well in vscode: # - Julia # - Perl # - Coffeescript # - R # [Writing macros] # If you don't have a custom keyboard layout that can # create λs, you may use backslashes instead. # (As in `T = \ab.b`) # # This file must only contain macro definitons. Commands will be ignored. # Statements CANNOT be split among multiple lines. # Comments CANNOT be on the same line as macro defintions. # All leading whitespace is ignored. # Misc Combinators M = λx.(x x) W = (M M) Y = λf.( (λx.(f (x x))) (λx.(f (x x))) ) # Booleans T = λab.a F = λab.b NOT = λa.(a F T) AND = λab.(a b F) OR = λab.(a T b) XOR = λab.((a (NOT b)) b) # Numbers # PAIR: prerequisite for H. # Makes a two-value tuple, indexed with T and F. # # H: shift-and-add, prerequisite for D # # S: successor (adds 1) # # D: predecessor (subtracts 1) # # Z: tests if a number is zero # NZ: equivalent to `NOT Z` # # ADD: adds two numbers # # MULT: multiply two numbers # # FAC: # Recursive factorial. Call with `Y FAC ` # Don't call this with numbers bigger than 5 unless you're very patient. # # `Y FAC 6` required 867,920 reductions and took 10 minutes to run. PAIR = λabi.(i a b) S = λnfa.(f (n f a)) H = λp.((PAIR (p F)) (S (p F))) D = λn.(n H (PAIR 0 0) T) Z = λn.(n (λa.F) T) NZ = λn.(n (λa.T) F) ADD = λmn.(m S n) MULT = λnmf.(n (m f)) FAC = λyn.(Z n) (1) (MULT n (y (D n)))