Size: a a a

2021 April 06

VM

Vyacheslav Mikushev in Lisp Forever
В лямда исчислении if определен приблизительно так:


(defun my-true (a b)
 (funcall a))

(defun my-false (a b)
 (funcall b))

(defun my-if (test a b)
 (funcall test a b))

(my-if #'my-false (lambda () (print "true")) (lambda () (print "false")))

(my-if #'my-true (lambda () (print "true")) (lambda () (print "false")))
источник

UT

Unknown T. in Lisp Forever
Да понятно, что через conitional jump, но сам conditional jump же тоже использует условие, получается…
источник

UT

Unknown T. in Lisp Forever
Хм. Тут вообще как-то не понятно, по факту просто вызываем функции и всё, ветвления нет, т.к. и then, и else ветки отрабатывают всегда
источник

VM

Vyacheslav Mikushev in Lisp Forever
Запусти код в sbcl и посмотри, что отрабатывает только определенная ветка.
источник

a

akater in Lisp Forever
Не устаю поражаться, что кто-то может написать такое, и при этом вписать туда print.
источник

UT

Unknown T. in Lisp Forever
Понятно, что в рамках одного вызова my-if отрабатывает определенная ветка
Я про то, что условия тут по сути нет, как в этом подходе сделать print true, если 5 > 2?
источник

A

Aragaer in Lisp Forever
это некоторый естественный, впитанный с молоком матери, способ проявления наружу эффектов
источник

A

Aragaer in Lisp Forever
надо не сам test, а функцию, которая вернет true или false
источник

A

Aragaer in Lisp Forever
то есть (funcall (funcall test) a b)
источник

A

Aragaer in Lisp Forever
и тогда (my-if (lambda () (> 5 2)) (lambda () "hello") (lambda () "world"))
источник

A

Aragaer in Lisp Forever
но и оператор > должен возвращать my-true и my-false
источник

UT

Unknown T. in Lisp Forever
и как он (оператор >) их может вернуть по-разному в зависимости от условия, если у нас нет if?
источник

VM

Vyacheslav Mikushev in Lisp Forever
Как-то так:
(defun my-> (n1 n2)
 (let ((tmp (vector #'my-false #'my-false #'my-true))
 (n (1+ (signum (- n1 n2)))))
   (aref tmp n)))

(my-if (my-> 2 1)
      (lambda () (print "more"))
      (lambda () (print "less")))

(my-if (my-> 1 2)
      (lambda () (print "more"))
      (lambda () (print "less")))
источник

UT

Unknown T. in Lisp Forever
Хм, ну да, разумно, перейти от ifов к математическим операциям и брать по индексу, спасибо!
источник

a

akater in Lisp Forever
Моя вера в человечество полностью уничтожена.
источник

A

Aragaer in Lisp Forever
вообще да, где-то внутри должен быть переход к "без ветвления"
источник

A

Aragaer in Lisp Forever
это как я помню разбирался с некоторым сишным кодом, где было что-то вроде
if (some_condition)
 some_var = 7;
else
 some_var = 5;
Но в ассемблере ветвления я не нашел. Там было вычисление условия (результат 0 или 1), дальше его умножили на 2 и прибавили к 5
источник

DS

Dork Schweider in Lisp Forever
Ещё можно при желании написать some_var = 7 * some_condition + 5 * !some_condition
источник

VM

Vyacheslav Mikushev in Lisp Forever
Почему?
источник

A

Aragaer in Lisp Forever
ага
источник