Рекурсивный if

Sergey ShishkinSergey Shishkin
2 min read

Зачем нам копировать определения, если их можно посмотреть на GitHub или просто даже в том же CLI. В командной строке “исследовать“ или “изучать“ объекты не комфортно, особенно, когда сталкиваешься с ними впервые, ну а в директориях у нас файлы, в которых эти определения не акцентированы отдельно, “не инкаписулированы”. Идеально, когда вся информация (или ссылки на неё) об объекте является его содержанием, помогает его фокусировать. Ну и, именно, такие инкапсулированные объекты мы только потом связываем, сранивая их между собой.

Ну и между делом, следуя принципу, что любая дополнительная интерпретация никогда не помешает, то к посту if-логика добавим все определения “if-ов”

   (NIL "if" _If)
   (NIL "ifn" _Ifn)
   (NIL "if2" _If2)
   (NIL "if@@" _IfAt2)

src/glob.l

# (if 'any1 any2 . prg) -> any
(de _If (Exe)
   (let X (cdr Exe)
      (if (nil? (eval (++ X)))
         (run (cdr X))
         (set $At @)
         (eval (car X)) ) ) )
# (if2 'any1 'any2 any3 any4 any5 . prg) -> any
(de _If2 (Exe)
   (let X (cdr Exe)
      (if (nil? (eval (++ X)))
         (if (nil? (eval (++ X)))
            (run (cdr (cddr X)))
            (set $At @)
            (eval (car (cddr X))) )
         (set $At @)
         (if (nil? (eval (++ X)))
            (eval (cadr X))
            (set $At @)
            (eval (car X)) ) ) ) )
# (ifn 'any1 any2 . prg) -> any
(de _Ifn (Exe)
   (let X (cdr Exe)
      (if (nil? (eval (++ X)))
         (eval (car X))
         (set $At @)
# (if@@ 'any1 any2 . prg) -> any
(de _IfAt2 (Exe)
   (let X (cdr Exe)
      (set $At (eval (++ X)))
      (if (nil? (val $At2))
         (run (cdr X))
         (eval (car X)) ) ) )

Мало того, что здесь с десяток зависимостей, так ещё и рекурсия!

https://picolisp-manual.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

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