# $Id: lambda-calculus.pl,v 0.1 2005/09/05 12:16:18 dankogai Exp dankogai $ # # Please remember to update t/examples/examples.t and rename # examples/output/algorithms/lambda-calculus if you rename/move this file. use v6-alpha; =begin reference Message-Id: http://www.nntp.perl.org/group/perl.perl6.language/22991 Message-Id: <20050905061111.GA25085@aut.dyndns.org> http://www.nntp.perl.org/group/perl.perl6.language/22992 =cut our $VERSION = sprintf "%d.%02d", q$Revision: 0.1 $ ~~ m:P5:g/(\d+)/; # macro lambda { 'sub' } our $ZERO = sub($f){ sub($x){ $x }}; our $SUCC = sub($n){ sub($f){ sub($x){ $f.($n.($f)($x)) }}}; our $ADD = sub($m){ sub($n){ sub($f){ sub($x){ $m.($f)($n.($f)($x)) }}}}; our $MULT = sub($m){ sub($n){ sub($f){ $m.($n.($f)) }}}; our $POW = sub($m){ sub($n){ $n.($m) }}; =begin alternative our $ZERO = -> $f { -> $x { $x } }; our $SUCC = -> $n { -> $f { -> $x { $f.($n.($f)($x)) }}}; # ... =cut sub num2int($n){ $n.(sub($i){ 1 + $i })(0) } sub num2str($n){ [~] 'sub($f){ sub($x) { ', $n.( sub($s){ $s.fmt('$f.(%s)') } )('$x'), ' }}' } sub int2num($n){ ($n == 0) ?? $ZERO !! $SUCC.(int2num($n - 1)) } =begin alternative our $ADD = sub($m){ sub($n){ $n.($SUCC)($m) }}; our $MULT = sub($m){ sub($n){ $n.($ADD.($m))($ZERO) }}; our $POW = sub($m){ sub($n){ $n.($MULT.($m))($SUCC.($ZERO)) }}; =cut my $one = $SUCC.($ZERO); my $two = $SUCC.($one); my $four = $ADD.($two)($two); my $eight = $MULT.($two)($four); my $sixteen = $POW.($four)($two); for $one, $two, $four, $eight, $sixteen -> $n { $n.(sub($i){ 1 + $i })(0).say };