NAME

t/op/lexicals.t - Lexical Ops

SYNOPSIS

% prove t/op/lexicals.t

DESCRIPTION

Tests various lexical scratchpad operations, as described in PDD20.

;;; Indicate that the computation has failed, and that the program
;;; should try another path.  We rebind this variable as needed.
(define fail
  (lambda () (error "Program failed")))

;;; Choose an arbitrary value and return it, with backtracking.
;;; You are not expected to understand this.
(define (choose . all-choices)
  (let ((old-fail fail))
    (call-with-current-continuation
     (lambda (continuation)
       (define (try choices)
         (if (null? choices)
             (begin
               (set! fail old-fail)
               (fail))
             (begin
               (set! fail
                    (lambda () (continuation (try (cdr choices)))))
               (car choices))))
       (try all-choices)))))

;;; Find two numbers with a product of 15.
(let ((x (choose 1 3 5))
      (y (choose 1 5 9)))
  (for-each display `("Trying " ,x " and " ,y #\newline))
  (unless (= (* x y) 15)
    (fail))
  (for-each display `("Found " ,x " * " ,y " = 15" #\newline)))

# The following PIR should be like:

use strict;

test_closures();

sub test_closures { my @closures;

# create some closures, outer scope
{
     my $shared = 1;

     # inner scope
     for (1..3) {
        my $not_shared = 1;
        my $sub_num    = $_;
        push @closures,
             sub {
                 print "Sub $sub_num was called $not_shared times. Any sub was called $shared times.\n";
                 $shared++;
                 $not_shared++;
             };
     }
}

for ( 1 .. 4 ) {
     foreach ( @closures ) {
         $_->();
     }
}

}