complex

html-dsl.php

<?php

def_sprintfer('a', "<a href='%s'>%s</a>");
def_sprintfer('img', "<img src='%s'>");

def('def_tag',function($name){
		def_sprintfer($name, "<{$name}>%s</{$name}>\n");
	});

foreach(array('p','div','html','head','body','title', 'h1') as $tag)
	def_tag($tag);

echo html(head(title('Hello, World!')).
          body(div(h1('Hello, World!')).
	       div(p("This is a page about world!").
	           a("http://world.com", img("http://world.com/logo.jpg")))));
---
<html><head><title>Hello, World!</title>
</head>
<body><div><h1>Hello, World!</h1>
</div>
<div><p>This is a page about world!</p>
<a href='http://world.com'><img src='http://world.com/logo.jpg'></a></div>
</body>
</html>

core

1.simple-define.php

<?php
// Простой пример, как определить функцию с помощью bu.defun
def('hello', function(){ echo "Hello!"; });
hello();
?>
---
Hello!

2.undef.php

<?php
// С помощью undef можно разопределить функцию.
def('say', function(){ echo "one\n"; });
say();
def('say', function(){ echo "two\n"; });
say();
undef('say');
say();
?>
---
one
two
one

3.redefine.php

<?php
// С помощью bu.defun можно переопределять функции: 
def('name', function(){ 
	echo "Waserd"; 
});
name();
echo "\n";
def('name', function(){ 
	echo "Bubujka"; 
});
name();
?>
---
Waserd
Bubujka

4.absolute-undef.php

<?php
// При использовании undef - удаляется только последняя функция.
// Чтобы удалить всё - надо передать true вторым аргументом
for($i = 1; $i<5; $i++)
	def_printfer('say', "$i\n");

say();
undef('say');
say();
undef('say', true);
try{
	say();
}catch(Exception $e){
	echo "Catched!";
}
---
4
3
Catched!

5.redefine-def.php

<?php
// Возможно переопределить функцию def.
def('def', function($name, $fn){
        echo "Defining {$name}\n";
        bu\def\def($name, $fn);
});

def('hello', function(){
        echo "Hello, world!\n";
});
hello();
---
Defining hello
Hello, world!

5.return-closure-on-def.php

<?php
// При объявлении функций - возвращается замыкание. 
$fn = def('up', function($str){
        return strtoupper($str);
});

echo up('hello, world')."\n";
echo $fn('world, hello');
---
HELLO, WORLD
WORLD, HELLO

def_accessor

1.def_accessor.php

<?php
// def_accessor создаёт функцию, которая хранит в себе определённое значение и
// возвращает его при вызове. Ей можно передать в качестве аргумента новое
// значение
def_accessor('user');
if(is_null(user()))
	echo "null\n";
user('waserd');
echo user();
---
null
waserd

2.def_accessor_with_default_value.php

<?php
// Второй аргумент в функции - значение по умолчанию. 
def_accessor('user', 'waserd');
echo user()."\n";
user('bubujka');
echo user();
---
waserd
bubujka

3.return_old_value_on_set.php

<?php
// При установке нового значения - функция вернёт старое
def_accessor('user', 'waserd');
echo user('bubujka')."\n";
echo user();
---
waserd
bubujka

def_matcher

def_matcher.php

<?php
// def_matcher - объявляет функцию, которая сопоставляет свой аргумент с
// регулярным выражением
echo (int)function_exists('is_az');

def_matcher('is_az', '/^[a-z]+$/');

echo (int)function_exists('is_az');
foreach(array('', '1', 'a2', 'E', '_') as $v)
	echo (int)is_az($v);

foreach(array('a', 'qwerty') as $v)
	echo (int)is_az($v);

---
010000011

def_wrapper

1.def_wrapper-undef_wrapper.php

<?php
// При оборачивании функций с помощью def_wrapper - их можно всегда можно
// развернуть обратно
$wrapper = function($call){
	$call->args[0]++;
	echo ">";
	$call();
};
def('say', function($i){ echo $i."\n"; });
say(1);
def_wrapper('say', $wrapper);
say(1);
def_wrapper('say', $wrapper);
say(1);
undef_wrapper('say');
say(1);
undef_wrapper('say');
say(1);
?>
---
1
>2
>>3
>2
1

2.argument-overwrite-in-def_wrapper.php

<?php
// Оборачивая функцию с помощью def_wrapper возможно переопределять
// передаваемые аргументы
def('m2', function($i){ return $i * 2; });
def_wrapper('m2', function($call){ return $call(3); });
echo m2(2);
?>
---
6

deflet

deflet.php

<?php
// С помощью deflet можно выполнить участок кода, так что
// определённые/переопределённые функции не будут видны за его пределами
def_printfer("say", "one\n");
say();
deflet(function(){
		def_printfer("say", "two\n");
		say();
	});
say();
?>
---
one
two
one

functions

def-state-fns.php

<?php
// def_state_fns принимает 4 аргумента: 
// - название для функции возвращающей нормальное значение
// - ................................. инвертированное значение
// - функция, которая устанавливает значение
// - ................ возвращает значение
// Ниже рассмотрен пример авторизации пользователя, с хранением значения в
// в сессии:
session_start();
def_state_fns('is_user', 'is_guest',
	      function($v){
		      $_SESSION['is_user'] = $v;
	      },
	      function(){
		      return isset($_SESSION['is_user']) ? $_SESSION['is_user'] : false;
	      });

$pr = function(){
	$tf = function($v){ echo ($v ? 'true' : 'false')."\n";};
	$tf(is_user());
	$tf(is_guest());
};
//default state
$pr();

//inverse state
is_user(true);
$pr();

//set over is_guest();
is_guest(true);
$pr();

?>
---
false
true
true
false
false
true

def_alias.php

<?php
// def_alias - создаёт алиас для функции. 
def('one', function(){ echo 1; });
def_alias('one', 'two');
one();
two();
?>
---
11

def_antonyms.php

<?php
// def_antonyms - создаёт 2 функции, которые инверсируют булевые значения,
// оставляя все остальные без изменений.
def_antonyms('is_boy', 'is_girl',
	     function($name){
		     if($name == 'alexey')
			     return true;
		     if($name == 'lena')
			     return false;
		     if($name == 'string')
			     return 'string';
		     return null;
	     });

def('t', function($v){
		if(is_null($v))
			$text = "null";
		elseif($v === false)
			$text = "false";
		elseif($v === true)
			$text = "true";
		else
			$text = $v;
		echo $text."\n";
	});

t(is_boy('alexey'));
t(is_boy('lena'));
t(is_boy('fido'));
t(is_boy('string'));

t(is_girl('alexey'));
t(is_girl('lena'));
t(is_girl('fido'));
t(is_girl('string'));
?>
---
true
false
null
string
false
true
null
string

def_constructor.php

<?php
// def_constructor принимает в качестве первого аргумента имя создаваемой
// функции. Функция будет конструировать массивы получая лишь значения для
// полей.
def_constructor('mk_user', 'name', 'age');
$one = mk_user('alex', 21);
$two = mk_user('sasha', 28);
foreach(array($one,$two) as $u){
	foreach($u as $k=>$v)
		echo $k.": ".$v."\n";
	echo "-\n";
}
---
name: alex
age: 21
-
name: sasha
age: 28
-

def_converter.php

<?php
// def_converter служит для создания преобразующих функций. Она создаёт 2
// функции: к примеру down_to_up - для преобразования 1 аргумента, и
// downs_to_ups для преобразования массива аргументов.
def_converter('down', 'up', function($s){return strtoupper($s);});
echo down_to_up('hello')."\n";
foreach(downs_to_ups(array('wor', 'ld')) as $v)
	echo $v."\n";
?>
---
HELLO
WOR
LD

def_printfer.php

<?php
// def_printfer принимает название функции которую надо создать и шаблон.
// Привызове она будет использовать шаблон как первый аргумент для printf.
def_printfer('h1', '<h1>%s</h1>');
h1('hello!');
?>
---
<h1>hello!</h1>

def_return.php

<?php
// def_return создаёт функцию, которая просто возвращает определённое
// значение.
def_return('user_name', 'waserd');
echo user_name();
?>
---
waserd

def_sprintfer.php

<?php
// def_sprintfer - делает тоже что и def_printfer, но используя функцию sprintf
def_sprintfer('h1', '<h1>%s</h1>');
$v = h1('hello!');
echo ">".$v."<";
?>
---
><h1>hello!</h1><

getfn

getfn.php

<?php
// Объявленную через bu.defun функцию всегда можно получить как
// замыкание с помощью getfn
def_printfer('say', "Hello!\n");
$fn = getfn('say');
$fn();
echo "\n";

// Проверим как будет реботать при переопределении
def_printfer('say', "Hello #2!\n");
$fn2 = getfn('say');
$fn();
$fn2();
echo "\n";

// А если ещё и разопределить функцию?..
undef('say');
$fn3 = getfn('say');
$fn();
$fn2();
$fn3();
---
Hello!

Hello!
Hello #2!

Hello!
Hello #2!
Hello!

import

import_ns.php

<?php
// import_ns - импортирует функции в глобальный нэймспэйс из другого.
namespace{
	require_once "load.php";
}
namespace foo\bar\baz{
	function one(){ echo 1; }
	function two(){ echo 2; }
	function three(){ echo 3; }
}
namespace{
	import_ns('foo\bar\baz');
	one();
	two();
	three();
}
?>
---
123

inspector

def_text_inspector.php

<?php
// def_text_inspector - оборачивает функцию, так что можно следить за её
// вызовом, переданными аргументами и возвращаемыми значениями
set_time_limit(1);
def('inc', function($i){
		echo "Increment {$i}\n";
		return $i + 1;
	});

def_text_inspector('inc');
echo inc(3, 'hello');
?>
---
>> Calling 'inc' function with arguments:
>> - 3
>> - hello
Increment 3
>> return value is '4'
4

memcached

1.def_md.php

<?php
bu\def\memcached_prefix('bu.def.tests');
defmd('sum', function($a, $b){
		echo '.';
		return $a+$b;
	});
echo sum(1,2)."\n";
echo sum(1,2)."\n";
flush_all();
echo sum(1,2)."\n";
echo sum(1,2)."\n";
?>
---
.3
3
.3
3

2.def_md-with-key.php

<?php
// Четвёртым аргументом для def_md можно передат функцию, которая будет
// создавать ключ для кэширования результатов
bu\def\memcached_prefix('bu.def.tests');
defmd('sum', function($a, $b){ echo "."; return $a+$b; },
       5,     
       function($fname, $args){
	       return "{$fname}:".implode('-', $args);
       });

echo sum(1,2)."\n";
echo sum(1,2)."\n";
echo bu\def\memcached()->get('sum:1-2')."\n";

flush_all();
echo bu\def\memcached()->get('sum:1-2')."\n";
echo sum(1,2)."\n";
echo sum(1,2)."\n";
?>
---
.3
3
3

.3
3

3.defmd-different-prefixes.php

<?php
bu\def\memcached_prefix('bu.def.tests');
defmd('sum', function($a, $b){
		echo '.';
		return $a+$b;
	});
echo sum(1,2)."\n";
echo sum(1,2)."\n";
echo sum(2,2)."\n";
bu\def\memcached_prefix('bu.def.tests2');
echo sum(1,2)."\n";
echo sum(1,2)."\n";
echo sum(2,2)."\n";
bu\def\memcached_prefix('bu.def.tests');
echo sum(1,2)."\n";
echo sum(2,2)."\n";
?>
---
.3
3
.4
.3
3
.4
3
4

4.static-cache-in-defmd.php

<?php
// defmd сохраняет все результаты в bu\def\Memo::$memcached_static_cache
// Это чтобы лишний раз не обращаться к memcached
bu\def\memcached_prefix('bu.def.tests');
defmd('test_md', function($r){
        echo '.';
        return ($r * 2)."\n";
});
echo test_md(1);
echo test_md(1);
echo test_md(2);
flush_md();
echo test_md(1);
echo test_md(2);
flush_all();
echo test_md(1);
echo test_md(1);
echo test_md(2);
?>
---
.2
2
.4
2
4
.2
2
.4

memo

1.def_memo.php

<?php
// def_memo создаёт функцию, которая хранит все результаты вычислений.
// http://en.wikipedia.org/wiki/Memoization
def_memo('sum', function($a, $b){
		echo '.';
		return $a+$b;
	});
echo sum(1,2)."\n";
echo sum(1,3)."\n";
echo sum(1,2)."\n";
echo sum(2,1);
?>
---
.3
.4
3
.3

2.def_memo_for_singleton.php

<?php
// def_memo может использоваться вместе с объектами
class DB{
	static $count = 0;
	function __construct(){
		self::$count++;
	}
	function count(){
		echo self::$count;
	}
}

def_memo('db', function(){
		return new DB;
	});

db()->count();
db()->count();
db()->count();
---
111

3.def_memo_return_closure.php

<?php
// def_memo возвращает замыкание. его можно использовать по своему усмотрению.
$v = def_memo('sum', function($a, $b){
		echo '.';
		return $a+$b;
	});
echo sum(1,2)."\n";
echo sum(1,3)."\n";
echo sum(1,2)."\n";
echo sum(2,1)."\n";

echo $v(4,5)."\n";
echo $v(1,2)."\n"; // использует ту же память что и sum()?
echo $v(4,5)."\n";
?>
---
.3
.4
3
.3
.9
3
9

modules

1.def.php

<?php
// Используя def возможно создавать статические функции внутри классов. Классы
// не должны быт объявленны ранее.
// Синтаксически это похоже на модули в ruby. 
def("hello::world", function($what){
		echo "Hello, {$what}!";
	});

hello::world('waserd');
---
Hello, waserd!

2.import.php

<?php
// С помощью import возможно загрузить функции в глобальное пространство.
def("foo::one", function(){echo 1;});
def("foo::two", function(){echo 2;});
def("foo::three", function(){echo 3;});
foo::one();
foo::two();
foo::three();
echo "\n";
import("foo");
one();
two();
three();
---
123
123

3.module_def.php

<?php
// Если надо определить несколько функций внутри модуля, то это удобнее сделать
// с помощью функции module.
module('foo', function(){
		def('one', function(){echo 1;});
		def('two', function(){echo 2;});
		def('three', function(){echo 3;});
		def_printfer('hello', 'Hello, %s');
	});

foo::one();
foo::two();
foo::three();
foo::hello('waserd');
---
123Hello, waserd

ns

1.def.php

<?php
// Используя обратный слэш можно создавать функции внутри другого нэймспэйса
def('foo\bar\baz\hello', function(){ echo "Hello!"; });
foo\bar\baz\hello();
?>
---
Hello!

2.ns_def.php

<?php
// Для создания нескольких функций в другом нэймспэйсе - стоит использовать
// функцию ns().
ns('foo\bar\baz', function(){
		def('one', function(){echo 1;});
		def('two', function(){echo 2;});
		def('three', function(){echo 3;});
		def_printfer('hello', 'Hello, %s');
	});

foo\bar\baz\one();
foo\bar\baz\two();
foo\bar\baz\three();
foo\bar\baz\hello('waserd');
---
123Hello, waserd


signals

basic-noise.php

<?php
def_printfer('p', "%s\n");
p(1);
noise('warning');
p(2);
catcher('warning', function(){ echo "warning!\n"; });
noise('warning');
p(3);
?>
---
1
2
warning!
3

catched-signal.php

<?php
catcher('warning', function(){ echo "catched"; });
signal("warning");
---
catched

catcher-redefine.php

<?php
def_printfer('p', "%s\n");
p(1);
catcher('warning', function(){ echo "warning!\n"; });
noise('warning');
p(2);
catcher('warning', function(){ echo "error!\n"; });
noise('warning');
p(3);
?>
---
1
warning!
2
error!
3

noise-with-args.php

<?php
catcher('warning', function($one, $two, $three){
	echo $one.$two.$three;
});
noise('warning', 1,2,3);
?>
---
123

uncatched-signal.php

<?php
try{
	signal("warning");
}catch(bu\def\UncatchedSignalException $e){
	echo "catched";
}
?>
---
catched