Привет всем. Не попадалась ли кому случайно библиотечка/класс хотя бы с основными тернарными операциями? Могу реализовать сам, сперва хотелось убедиться, что это не есть велосипед. Не нагуглил (мог плохо гуглить). Цель - просто интерес, практика, возможно какое-то использование в проектах, хотя пока трудновато представить. Что-то подсказывает, что можно отказаться от исключений. Кто не в курсе - это логика не 1/0, а 1/0/-1. Пару лет назад такое писал, но проект отправился в рай для жестких дисков. Код получался примерно такой: // true3=1="да", false3=-1="нет", null3=0="не знаю" $systemStatus = and3($s1->getstatus(), $s2->getstatus(), $s3->getstatus()); if ($systemStatus === true3) { echo 'all systems: ready'; } elseif ($systemStatus === false3) { echo 'all systems: idle'; } else echo 'malfunction'; PS: Ничего общего с тернарным оператором.
Ответ
Взялся сам :)
Ссылка на тестер (там же можно скачать класс и посмотреть таблицы истинности), листинг основных операторов для будущих поколений:
define('TRUE3', 1);
define('NULL3', 0);
define('FALSE3', -1);
function l3validate(&$arg) {
if ($arg !== FALSE3 and $arg !== NULL3 and $arg !== TRUE3) {
$arg = NULL3;
return FALSE3;
}
return TRUE3;
}
function l3not($a) { // НЕ, инверсия
l3validate($a);
if ($a === TRUE3) return FALSE3;
if ($a === FALSE3) return TRUE3;
return NULL3;
}
function l3and($a, $b) { // И, конъюнкция
l3validate($a);
l3validate($b);
if ($a === TRUE3 and $b === TRUE3) return TRUE3;
if ($a === FALSE3 or $b === FALSE3) return FALSE3;
return NULL3;
}
function l3andm() { // И, несколько аргументов
$result = TRUE3;
foreach (func_get_args() as $arg) {
l3validate($arg);
if ($arg === NULL3) $result = NULL3;
if ($arg === FALSE3) return FALSE3;
}
return $result;
}
function l3or($a, $b) { // ИЛИ, дизъюнкция
l3validate($a);
l3validate($b);
if ($a === $b and $a === FALSE3) return FALSE3;
if ($a === TRUE3 or $b === TRUE3) return TRUE3;
return NULL3;
}
function l3orm() { // ИЛИ, несколько аргументов
$result = FALSE3;
foreach (func_get_args() as $arg) {
l3validate($arg);
if ($arg === NULL3) $result = NULL3;
if ($arg === TRUE3) return TRUE3;
}
return $result;
}
function l3xor($a, $b) { // ЛИБО ... ЛИБО ..., строгая дизъюнкция
l3validate($a);
l3validate($b);
if ($a === $b and $a !== NULL3) return FALSE3;
if (($a === TRUE3 and $b === FALSE3) or ($a === FALSE3 and $b === TRUE3)) return TRUE3;
return NULL3;
}
function l3imp($a, $b) { // ->, импликация
l3validate($a);
l3validate($b);
if ($a === FALSE3 or $b === TRUE3) return TRUE3;
if ($a === TRUE3 and $b === FALSE3) return FALSE3;
return NULL3;
}
function l3bimp($a, $b) { // <-, обратная импликация
l3validate($a);
l3validate($b);
if ($a === TRUE3 or $b === FALSE3) return TRUE3;
if ($a === FALSE3 and $b === TRUE3) return FALSE3;
return NULL3;
}
function l3eq($a, $b) { // =, эквивалентность
l3validate($a);
l3validate($b);
if ($a === NULL3 or $b === NULL3) return NULL3;
if ($a === $b) return TRUE3;
return FALSE3;
}
ЗЫ: Специально для @Dex: обсуждение терминов, таки ваша взяла) Но все же посмотрите обсуждение, оно оказалось сложным и чисто эстетическим. Даже вариант "трехвалентная" был бы верным лексически %)
UPDATE: Исправил "идейно", любое "неопознанное" превращается в NULL3. Если хочется быть более толерантным, в классе есть метод cast, округляющий до ближайшего из логических.
Комментариев нет:
Отправить комментарий