← All posts tagged Lisp

я понял, почему мне нравится писать на лиспе прототипы. Дело, на самом деле, в скобочках :) Благодаря им программа на лиспе выглядит и пишется как текст.
Вот почему, оказывается, я обычно выключаю подсветку синтаксиса, когда пишу на лиспе. Это же больше исполняемый текст, а не просто код.
Метапрограммирование, clos, repl — все фигня. Главное — скобочки!

linj (https://github.com/xach/linj) — транслятор коммон лиспа в яву (компилируемую jvm-1.1 и выше). Выглядит красиво. (да, новость про linj видел еще в начале года, но только руки дошли почитать туториал)

еще один элементарный, но красивый пример из лямбда-исчисления. (этот пример есть также в SICP). Определяем на лиспе функцию проверки условия, пользуясь только лямбда-функциями. (на схеме или хаскелле этот пример выглядел бы, кончено же, лаконичнее).

(defun true (a b) (declare (ignore b))
a)

(defun false (a b) (declare (ignore a))
b)

(defun if-then-else (condition then else)
(funcall condition then else))

(if-then-else #'true 1 2) ;; ==> 1
(if-then-else #'false 1 2) ;; ==> 2

числа черча — красивая вещь, позволяет записывать арифметические выражения, используя только механизм лямбда-функций. например, на лиспе:

;; инкремент
(defun s (number)
(lambda () number))
;; декремент
(defun p (number)
(funcall number))

(defvar zero nil)

(defun minus (n m)
(cond ((and (eq n zero) (eq m zero)) zero)
((eq m zero) n)
(t (minus (p n) (p m)))))

(defun cmp (n m)
(eq zero (minus n m)))

;; тестим
(let* ((one (s zero))
(two (s (s zero)))
(three (s two)))
(cmp one (minus three two))) ;; => t

(cmp (s (s zero)) (s (p (s (s zero))))) ;; => t
(cmp (s (s zero)) (p (p (s (s zero))))) ;; => nil

как пишут в новостях ABCL "CLOS work on trunk". И это здорово! (abcl — лисп на ява-машине, разработка возобновилась где-то год назад, поддержка clos и, особенно, mop была неполной)