parrotcode: Lexical Ops Contents | Tests

# 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 ) {
\$_->();
}
}```

}