Exemplo n.º 1
0
 /**
  * @test
  * @dataProvider provideExpand
  */
 public function expand($expected, $sexpr, array $macros = [])
 {
     $walker = new Walker();
     $env = Environment::standard();
     foreach ($macros as $name => $pair) {
         list($argsSexpr, $bodySexpr) = $pair;
         $macroArgs = $this->parseSexpr($argsSexpr);
         $macroBody = $this->parseSexpr($bodySexpr);
         $env[$name] = new SpecialOp\MacroOp($macroArgs, $macroBody);
     }
     $form = $this->parseSexpr($sexpr);
     $expanded = $walker->expand($env, $form);
     $this->assertEquals($expected, $expanded->getAst());
 }
Exemplo n.º 2
0
<?php

// example call:
// php examples/macro-expand.php
//     "(defmacro when (condition a b c) (list 'if condition (list 'begin a b c)))"
//     "(when (> x 10) 1 2 3)"
namespace Igorw\Ilias;

require __DIR__ . '/../vendor/autoload.php';
if ($argc < 3) {
    echo "Usage: php examples/macro-expand.php MACROS CODE\n";
    exit(1);
}
list($_, $macros, $code) = $argv;
$program = new Program(new Lexer(), new Reader(), new FormTreeBuilder(), new Walker());
$env = Environment::standard();
$program->evaluate($env, $macros);
$expandedForms = expand($env, $code);
foreach ($expandedForms as $expanded) {
    echo encode($expanded->getAst()) . "\n";
}
function buildForms($code)
{
    $lexer = new Lexer();
    $reader = new Reader();
    $builder = new FormTreeBuilder();
    $tokens = $lexer->tokenize($code);
    $ast = $reader->parse($tokens);
    return $builder->parseAst($ast);
}
function expand(Environment $env, $code)