if-логика

Sergey ShishkinSergey Shishkin
2 min read

Да, попытки выделить её в специальную логику имеют место быть и в разных вариациях (См. революция в логике …). Заметил, что со временем меняются на эту тему даже интерпретации в википедии … А по сути, это импликация, в которой левая часть - не просто имя параметра, а выражение, обозначающее правило или условие, то есть описывающее некоторый факт, детерминированный с правой частью, в которой мы уже привыкли видить сложные предикации. Короче, кроме просто переходов, у нас есть ещё и условные переходы, которые часто так и называют. В любом случае, я считаю эту проблему синтаксической и против усложнения, в частности, введением всяких “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

https://picolisp.tiddlyhost.com/#if

0
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

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