<?xml version="1.0" encoding="windows-1252"?>
<node id="996373" title="PERLISP meditations" created="2012-09-29 09:08:58" updated="2012-09-29 09:08:58">
<type id="120">
perlmeditation</type>
<author id="989970">
protist</author>
<data>
<field name="doctext">
&lt;p&gt;
I watched an MIT lecture on youtube demonstrating some of the abstraction power of LISP.  Then I tried my hand at duplicating the functionality in Perl.  Below I will post the LISP code, and the Perl equivalent.
&lt;/p&gt;
&lt;p&gt;
LISP
&lt;/p&gt;
&lt;code&gt;
(DEFINE (SUM TERM A NEXT B)
        (IF (&gt; A B)
                0
                (+ (TERM A)
                        (SUM TERM
                                (NEXT A)
                                NEXT
                                B))))

(DEFINE (SUM-INT A B)
        (DEFINE (IDENTITY X) X)
        (SUM INDENTITY A 1+ B))

(DEFINE (SUM-SQ A B)
        (SUM SQUARE A 1+ B))

(DEFINE (SQUARE A) (* A A))


(SUM-INT 3 5)

(SUM-SQ 3 5)
&lt;/code&gt;

&lt;p&gt;
Perl
&lt;/p&gt;
&lt;code&gt;
#!/usr/bin/perl
use warnings;
use strict;
use feature "state"; 

sub sum # TERM A NEXT B
{	
	state $sum;
	my ($TERM, $A, $NEXT, $B) = @_;
	if ($A&gt;$B){ 
		my $temp=$sum;
		$sum=0;
		return $temp ;
		}
	$sum+=&amp;{$TERM}($A);
	sum( $TERM, &amp;{$NEXT}($A) ,$NEXT, $B);
}

sub identity{
	shift;
	}

sub square{
	((shift)**2);
	}

sub sumint { sum(\&amp;identity,shift,sub {((shift)+1)},shift)}

sub sumsq { sum(\&amp;square,shift,sub {((shift)+1)},shift)}

#a normal sum from 3-5
print sumint(3,5) . "\n";
#a sum of squares from 3-5
print sumsq(3,5) . "\n";
&lt;/code&gt;</field>
</data>
</node>
