if-логика

Да, попытки выделить её в специальную логику имеют место быть и в разных вариациях (См. революция в логике …). Заметил, что со временем меняются на эту тему даже интерпретации в википедии … А по сути, это импликация, в которой левая часть - не просто имя параметра, а выражение, обозначающее правило или условие, то есть описывающее некоторый факт, детерминированный с правой частью, в которой мы уже привыкли видить сложные предикации. Короче, кроме просто переходов, у нас есть ещё и условные переходы, которые часто так и называют. В любом случае, я считаю эту проблему синтаксической и против усложнения, в частности, введением всяких “else“. А тема, реально, ключевая, фундаментальная в вычислительном процессе, его определяющая база.
if - условное выполнение: если условие any1
оценивается как не NIL
, вычисляется и возвращается any2
. В противном случае выполняется prg
и возвращается результат.
(if 'any1 any2 . prg) -> any
: (if (> 4 3) (println 'OK) (println 'Bad))
OK
-> OK
: (if (> 3 4) (println 'OK) (println 'Bad))
Bad
-> Bad
if2 - четырехстороннее условное выполнение для двух условий: если оба условия any1 и any2 оцениваются как не NIL, вычисляется и возвращается any3. В противном случае вычисляется и возвращается any4 или any5, если any1 или any2 оцениваются как не NIL соответственно. Если ни одно из условий не оценивается как не NIL, выполняется prg и возвращается результат.
(if2 'any1 'any2 any3 any4 any5 . prg) -> any
: (if2 T T 'both 'first 'second 'none)
-> both
: (if2 T NIL 'both 'first 'second 'none)
-> first
: (if2 NIL T 'both 'first 'second 'none)
-> second
: (if2 NIL NIL 'both 'first 'second 'none)
-> none
ifn - условное выполнение («Если нет»): если условие any1
оценивается как NIL
, вычисляется и возвращается any2
. В противном случае выполняется prg
и возвращается результат.
(ifn 'any1 any2 . prg) -> any
: (ifn (= 3 4) (println 'OK) (println 'Bad))
OK
-> OK
if@@ - условное выполнение: если значение глобальной переменной @@ не равно NIL
после оценки any1
, вычисляется и возвращается any2
. В противном случае выполняется prg
и возвращается результат. В обоих случаях @
будет содержать значение any1
.
(if@@ 'any1 any2 . prg) -> any
: (de foo (N)
(if (lt0 N)
(throw 'lt0 N)
(sqrt N) ) )
-> foo
: (if@@ (catch 'lt0 (foo 64))
(msg @ " negative")
@ )
-> 8
: (if@@ (catch 'lt0 (foo -64))
(msg @ " negative")
@ )
-64 negative
-> -6
Subscribe to my newsletter
Read articles from Sergey Shishkin directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Sergey Shishkin
Sergey Shishkin
Всегда чему-то учусь!