← All posts tagged Lisp

asmer
? code Lisp
(defun filtered (&optional (filter-condition t))
  (maphash #'(lambda (k v)
	       (if (eval filter-condition)
		   (out-object v)))
	       *list*)

я правильно, понял, нет способа передать условие, которое проверяет k или v в эту функцию(так как filter-condition не находится в лексическом окружении k и v). Такое можно сделать только макросом (с подстановкой условия) или функцией вместо условия?
asmer
? Lisp говно Всякие наблюдения о CL:
сделал элементарный REPL, и он, зараза, выводил результат формы только после ввода следующей. Говно. Починилось (force-output).

Долго думал чем как можно сделать хранение данных на диске. Вариантов вроде много: можно писать формы print with-standard-io-syntax и читать их. Можно заюзать какой-нибудь интерфейс к СУБД. Можно какую-нибудь object persistence библиотеку. Но:
print не прокатил с объектами;
elephant не работает с sbcl 1.0.55;
sql и база в нагрузку мне не подходят;
либы старые как говно мамонта и мало поддерживаемые;
итого: заюзал пока cl-prevalence, по-крайней мере оно пишет и оно читается. Если что можно будет отловить swizard-а, взять его форк и поспрашивать.

Захотелось проитерировать слоты объекта. Опять какие-то костыли типа closer-mop:compute-slots, причем возвращают они объекты-слоты, типы которых насколько я понял привязаны к реализации. А захотелось мне этого из-за того, что родной format (насколько я понял) не умеет выводить поля объекта итеративно (~{~}).

Я уже молчу, что в aref вначале список, потом индекс, а в nth наоборот. С gethash и slot-value ситуация аналогичная. Многие жалуются на бардак в стандартной библиотеке PHP, но тут я особого порядка тоже не наблюдаю.

Кстати, а есть какие обобщающие функции/макросы/библиотеки, которые сами подставят правильный map/accessor/еще что по типу данных?
asmer
benchmark Lisp NoSQL SQL Решил я побаловаться с большими объемами данных в sbcl. Взял лог, откусил от него 1 250 000 строк и попарсил их.

Парсер cl-ppcre
Код читает файл, выкуривает оттуда дату/время, процесс, пид, хост и сообщение, записывает в один массив хосты (он у меня один) в один — название процесса ( у меня вышло около 25), в один массив дату, сообщение, индекс хоста, индекс процесса, pid. Потом все это пишется в лиспофайл (with-standard-io-syntax).

Итоги:
размер лога — 158602612 (1250000 записей)
размер итогово лиспофайла — 219861450
Время парсинга — 45 секунд.
Время записи лиспофайла — 45 секунд.
Потребление памяти (RES) — ~1050 mb.

Потом этот файл загружается в sbcl:
Время загрузки — около 55 секунд,
Время сортировки по сообщениям:
(sort a #'string< :key #'(lambda (record) (getf record :message))) — 22 секунды.
Время сортировки по процессу (типа int foreign key): — около 1 секунды.
Время фильтрации: мгновенно (явно меньше секунды).

Железо — core 2 duo t7250 2gHz. Иксы и всякая хрень запущена, единственное что не давал свопить, закрывая всякие браузеры (рамы мало, всего 2gb).
Gentoo amd64-3.2.12.

Теперь вопрос — как бы побороть ограничение в лице памяти? Есть ли какие-то подобные штуки со сбросом данных на диск? Есть интересные статьи о подобных вещах?

В тред кастуются @archimag и @lovesan.
asmer
GTK GUI Lisp Qt дыбр *tk
решил потыкать в гуйню на CL. Ну что можно сказать, работает сразу ltk (tk биндинг, но выгдядит как... как TK), gtk+ вроде тоже работает, а с qt траблы.
asmer
Lisp числа оказывается cl умеет брать числа в любой системе счисления (от 2 до 36, лучше бы русский алфавит заюзали :D):
#36rZZ
1295
число ZZ в 36тичной системе счисления = 1295 в десятичной
asmer
(c) Haskell Lisp WTF `Делаешь пандорический захват, лифтишь в монаду, потом строишь рекурсивную схему (здесь подойдёт зигохистоморфный препроморфизм) как монадический трансформер из категории эндофункторов, и метациклически вычисляешь результат. Любой второкурсник справится. А если делать на анафорических лямбдах — так задачка вообще на пять минут.`
asmer
(c) C++ ferrum Lisp LOL А что касается Lisp — то да, меня сильно утомил, а точнее, откровенно заебал C++. Меня каждый раз передёргивает, когда я хочу произвести какие-либо вычисления во время компиляции (размер буфера для SPI — из недавнего), чтобы получить оптимальный и гибкий код. Путь, который предлагает C++ — путь в никуда. Метапрограммирование на шаблонах концептуально интересно, но это какой-то ментальный онанизм.

...

И да, всё вышесказанное относиться не только к ARM, но также к AVR и вообще любым МК, с которыми нам придётся работать. Но на ARM будет, конечно, проще — больше мощи и оперативку нарастить легко, если понадобится много памяти.
Ещё один важный момент — качественные и свободные компиляторы. Пока только GCC -_-, причём насчёт качества кое-где можно и усомниться. Остальное — за бабло. Это ещё один минус C++: чтобы написать для него хотя бы средненький компилятор, нужно либо быть гением, либо долбится несколько лет.

robocraft.ru
asmer
benchmark code Lisp Python
Маленький бенчмарк и его результаты:
lisp:
(defun simple(max)
  "Search for simple numbers up to max"
  (setq current-numbers (list 2))
  (do ((num 3 (incf num 2)))
    ((> num max))
    (setf found T)
    (dolist (prev current-numbers)
      (if (= 0 (mod num prev)) (PROGN (setf found NIL) (return)))
      (if (> prev (/ num 2)) (return)))
    (if found (PROGN (nconc current-numbers (list num)) 
                     (print num)))
    )
  )


(simple 100000)

python:
numbers = [2]
maxNum = 100000
new = 1

for i in xrange(3,maxNum):
    for j in numbers:
        if j>i/2:
            break
        if i%j == 0:
            new = 0
            break
    if new == 1:
        print i
        numbers.append(i)
    new = 1

print "\nTotal numbers: ",len(numbers)

*Итоги*:

*clisp:*
real	1m28.242s
user	1m27.110s
sys	0m1.266s

*sbcl:*
real	0m6.794s
user	0m6.615s
sys	0m0.114s

*python:*
real	0m10.486s
user	0m10.446s
sys	0m0.017s

за лиспокод не пинать - поиск простых чисел это мой hello world за последние 15 лет.
asmer
? Lisp racket Почитав PCL и погуглив, а так же почитав juick наткнулся на racket. А тут еще про него нечто пишут на habre в коментах к habrahabr.ru Кто нить может объяснить разницу?