Электропрохладительный Кислотный Тест [entries|archive|friends|userinfo]
Герцог Ебаш

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

[Jul. 4th, 2008|08:23 am]
[Tags|]

На defun.ru не так давно выкладывали ссылку на библиотеку RDNZL для Common Lisp, которая предоставляет FFI к .NET
http://www.weitz.de/rdnzl/

Единственное, чего мне очень не хватало в CL это нормальной библиотеки для GUI.
Теперь есть, и это охуенно.

Вот пример:

(asdf:operate 'asdf:load-op :rdnzl)
(use-package :rdnzl)

(import-assembly "mscorlib")
(import-assembly "System.Windows.Forms")

(use-namespace "System.Windows.Forms")

(enable-rdnzl-syntax)

(let ((form (new "Form"))
      (textBox (new "TextBox"))) 
  (setf
    [%Multiline textBox] t
    [%ScrollBars textBox] [$ScrollBars.Vertical]
    [%Text form] "Main"
    [%Width form] 350
    [%Height form] 250
    [%StartPosition form] [$FormStartPosition.CenterScreen]
    [%Parent textBox] form
    [%Text textBox] (reduce #'(lambda (x y) (concatenate 'string
                                                                                     (string x)
                                                                                     (string #\Return)
                                                                                     (string #\Newline)
                                                                                     (string y)))
                                      (remove-if-not #'(lambda (x)
                                                                        (search "RDNZL:" (write-to-string x)))
                                           (apropos-list "")))
    [%Dock textBox] [$DockStyle.Fill])
  [Application.Run form])

Link4 отписалось|Отписаться

[Jul. 3rd, 2008|10:50 am]
Зацените, как пиздато!
Ну, воще
Link1 отписался|Отписаться

[Jul. 1st, 2008|06:23 am]
http://paulgraham.com/say.html
LinkОтписаться

[Jun. 30th, 2008|01:05 am]
Да, я упоротый же!
Кто еще? ^_____^
Link2 отписалось|Отписаться

[Jun. 29th, 2008|05:48 am]
Excuse me, but REAL programmers use butterflies!
LinkОтписаться

[Jun. 29th, 2008|05:45 am]
LinkОтписаться

[Jun. 29th, 2008|01:14 am]
[Current Music |DIGITALLY IMPORTED - Trance - Matt Darey presents - Nocturnal(28 June 2008)]

Di.fm охуенно.
С тех пор, как появился безлимит, постоянно его слушаю.
Link1 отписался|Отписаться

[Jun. 27th, 2008|05:43 am]
А сегодня почти не орали.
Странно, да? Гэгэгэ
Link2 отписалось|Отписаться

[Jun. 26th, 2008|06:40 pm]
[Tags|]

Накатал вот непонятно чо. Функция, в которую раскрывается этот макрос, сравнивает несколько последовательностей (минимум 1, саму с собой) по длине и элементам, выдавая NIL на первом несовпадении реляционного оператора или отличии длины от первой последовательности в списке.

(defmacro comparse-arrays (rel-operator &rest sequences)
  (let ((length-first (gensym))
        (rest-arg (gensym))
        (seq-count (gensym)))
    `(let* ((,rest-arg (list ,@sequences))
            (,seq-count (length ,rest-arg))
            (,length-first (length (first ,rest-arg))))
       (dotimes (i ,seq-count)
         (when (and (< i 1) (> ,seq-count 1))
           (setf i 1))
         (when (/= (length (nth i ,rest-arg)) ,length-first)
           (return NIL))
         (when (/= (count NIL (map 'list ,rel-operator (nth i ,rest-arg) (first ,rest-arg))) 0)
           (return NIL))
         (when (= i (1- ,seq-count))
           (return T))))
)) 

Т. е. типо вот
(comparse-arrays #'> '(1 2 3) #(4 5 6) #(3 4 5)) ==> T
(comparse-arrays #'= #(1 2 3) '(1 2 3)) ==> T
а (comparse-arrays #'= '(1 2 3) '(4 5 6)) ==> NIL

Надо бы допилить, конешно, чтобы последовательно с предыдущим списком, а не только с первым, сравнивался.
И наверное, еще приделаю, чтобы при NIL возвращался кортеж - NIL, отличающуюся последовательность и номер элемента первого несовпадения.

Link3 отписалось|Отписаться

[Jun. 26th, 2008|03:39 am]
Moravec's Paradox is the discovery by artificial intelligence and robotics researchers that, contrary to traditional assumptions, the uniquely human faculty of reason (conscious, intelligent, rational thought) requires very little computation, but that the unconscious sensorimotor skills and instincts that we share with the animals require enormous computational resources. The principle was articulated by Hans Moravec, Rodney Brooks, Marvin Minsky and others in the 1980s. As Moravec writes: "it is comparatively easy to make computers exhibit adult level performance on intelligence tests or playing checkers, and difficult or impossible to give them the skills of a one-year-old when it comes to perception and mobility."
http://en.wikipedia.org/wiki/Moravec's_paradox

Интересно, типо.
LinkОтписаться

[Jun. 22nd, 2008|05:46 pm]
[Tags|]

Я очень долго не врубался в алгоритм быстрой сортировки. Фактически, до сегодняшнего дня.
С утра несколько раз пробовал написать на Лиспе в таком варианте, в каком он здесь на Си, но не получалось нифига, постоянно либо не полностью сортировался, либо индекс за границы последовательности вылетал(в лиспе нет цикла for в таком виде, в каком он есть в паскале и Си-подобных языках, пришлось и это велосипедить). Вот.
Но потом я заглянул на английскую страницу, увидел там псеводкод: 

function quicksort(array)
     var list less, greater
     if length(array) ≤ 1 
         return array 
     select a pivot value pivot from array
     for each x in array
         if x < pivot then append x to less
         if x > pivot then append x to greater
     return concatenate(quicksort(less), pivot, quicksort(greater))


схему:

И внезапно просветлел. 

(defun qsort (array sort-function)
  (if (<= (length array) 1)         
    array
    (let ((pivot (elt array (round (/ (length array) 2)))) less greater pivots)
      (map nil (lambda (x)
                          (cond ((equalp x pivot) (push x pivots))
                                   ((funcall sort-function x pivot) (push x less))
                                   ((not (funcall sort-function x pivot)) (push x greater))))
                  array)
      (concatenate (typecase array (string 'string)
                                                 (vector 'vector)
                                                 (list 'list))
                          (qsort less sort-function) pivots (qsort greater sort-function)))))

Моя функция принимает последовательность, функцию - реляционный оператор, выбирает pivot как элемент из середины и с помощью map(когда тип возвращаемой последовательности указывается nil, эта функция не возвращает ничего и используется просто для побочных эффектов), используя переданный реляционный оператор, раскидывает элементы по спискам - в less, greater или в pivots соответственно. Потом она создает новый массив из less, pivots и greater списков, предварительно рекурсивно вызывая себя для сортировки less и greater.
Не совсем корректо, правда, работает с функциями вроде =, string= итд - просто как попало перемешивает массив. Но, во-первых, кому придет в голову сортировать оператором равенства, и во-вторых, это можно поправить, например, поставив в if наверху вместо (<= (length array) 1) что-нибудь типо
 (or (<= (length array) 1)
    (member sort-function (list #'= #'string= #'string-equal #'char= #'char-equal #'eq #'eql #'equal #'equalp)))

Работает вобщем так:
(qsort #(1 9 8 7 3 5 0 2 4 6) #'<)
вернет #(0 1 2 3 4 5 6 7 8 9)

(qsort "ХУИТА" #'char<)
соответственно "АИТУХ"

UPD: Внезапно.
(defun prob-qsort (array rel-operator)
  (if (<= (length array) 1)
    array
    (let ((pivot (elt array (random (length array)))))
      (concatenate (typecase array (string 'string)
                                                   (bit-vector 'bit-vector)
                                                   (vector 'vector)
                                                   (list 'list))
                   (prob-qsort (remove-if #'(lambda (x) (or (equalp x pivot)
                                                                               (not (funcall rel-operator x pivot)))) array) rel-operator)
                   (remove-if-not #'(lambda (x) (equalp x pivot)) array)
                   (prob-qsort (remove-if #'(lambda (x) (or (equalp x pivot)
                                                                               (funcall rel-operator x pivot))) array) rel-operator)))))

LinkОтписаться

[Jun. 22nd, 2008|03:16 am]
Да еб твою, я нажрался и хочу спать, а мудаки под окнами все орут.
Футбольные фанаты - бляди хуже мусоров.
Link2 отписалось|Отписаться

[Jun. 22nd, 2008|03:13 am]
Футбол - для мудаков и быдла.
Link5 отписалось|Отписаться

[Jun. 22nd, 2008|03:09 am]
Ну, я за Голладнию 'болел'.
Ненавижу потому что, блядь, поганую рашку.

А на улицах сейчас дохуя русского быдла.
"Ра-се-я Ра-се-я"
Убивать.
Link20 отписалось|Отписаться

[Jun. 14th, 2008|09:14 am]
Пощитал факториал 100000, с помощью встроенной функции ! из CLISP.
Текстовый файл с этим числом занимает 446 килобайт (в юникоде 891 килобайт) и состоит из 456754 символов цифр. Вот он.
Посчиталось, кстати, достаточно быстро - вместе с выводом в файл где-то секунд 40, я удивился даже. И это на моем-то калькуляторе.
Те, кто говорят, что Лисп тормозной - ебанутые.
Link5 отписалось|Отписаться

[Jun. 14th, 2008|12:46 am]
Uh, yeah, uh, longbeach in da house, uh yeah
Oaktown, Oakland definately in da house hahaha
Frisko, Frisko
Hey, you know LA is up in this
Pasadina, where you at
Yeah, Ingelwood, Ingelwood always up to no good
Even Hollywood tryin to get a piece baby
Sacramento, sacramento where ya at? yeah
Throw it up y'all, throw it up, Throw it up
Let's show these fools how we do this on that west side
Cause you and I know it's tha best side
Yeah, That's riight
West coast, west coast
Uh, California Love
California Love
LinkОтписаться

[Jun. 14th, 2008|12:43 am]
California dreamin'

ох
Link2 отписалось|Отписаться

[Jun. 14th, 2008|12:03 am]
[Current Music |2Pac - California love]

California
Knows how to party

Ох, я нажрался
LinkОтписаться

[Jun. 11th, 2008|10:36 pm]
[Tags|]

http://local.joelonsoftware.com/mediawiki/index.php/А ваш язык программирования так может?

В Common Lisp уже есть встроенные функции Map и Reduce.
Однако, если бы их не было, реализовать их было бы не так уж и сложно. 

Вот довольно простая версия Map. Я не знаю точно, как map реализована в Common Lisp - итеративно или рекурсивно, но предполагаю, что итеративно, ради увеличения производительности. 
Моя версия использует итерацию, во всяком случае.
Работает только с одной последовательностью. Но этого достаточно, чтобы использовать ее, например, в foreach здесь

(defun my-map (seq-type fun seq)

(let* ((seq-length (length seq))
(new-seq (cond
((eq seq-type 'string)
(make-array seq-length :element-type 'character))
((eq seq-type 'vector)
(make-array seq-length))
((eq seq-type 'list)
(make-list seq-length)))))
(dotimes (n seq-length)
(setf (elt new-seq n) (funcall fun (elt seq n))))
new-seq))
Reduce:
(defun my-reduce (fn seq)
  (let ((len (length seq))
  (temp (elt seq 0)))
    (dotimes (i len)
      (when (= i (1- len)) (return temp))
      (setf temp (funcall fn temp (elt seq (1+ i)))))))
Ну и функции sum и join из статьи:
Sum:
(defun sum (arr) (my-reduce #'+ arr))
C join немного больше кода. В Common Lisp строгая типизация(хоть и динамическая, не путать, типо), в отличие от Javascript. Поэтому придется реализовать дополнительную функцию, которая переводит что-либо в строку, на основе встроенных write-to-string и string.
(defun to-string (element)
  (cond  
    ((or (symbolp element)
       (characterp element)
       (stringp element)) (string element))
    (T (write-to-string element))))
И собственно join:
(defun join (arr)
(my-reduce #'(lambda (x y) (concatenate 'string (to-string x) (to-string y))) arr))

Link6 отписалось|Отписаться

[Jun. 11th, 2008|04:17 pm]
[Tags|]

foreach средствами языка:
(defmacro foreach ((element in-sign array-to-do) &body expression) 
        (if (and (symbolp element)
                 (eq in-sign ':in))
(let ((array-symbol (gensym)))
`(let ((,array-symbol (copy-seq ,array-to-do)))
(map (typecase ,array-symbol (vector 'vector)
(list 'list))

(lambda (,element) ,@expression) ,array-symbol)))
(error "Incorrect form: ~a"
`(foreach (,element ,in-sign ,array-to-do) ,@expression))))
Так как программы в Лиспе состоят из деревьев функций, каждая из которых возвращает значение, то и эта функция возвращает значение - отработанный массив. Преимущество, то есть, перед дотнетовским, например, foreach, который просто императивная конструкция языка.
 

(foreach (var in #(1 2 3 4 5 #\a #\b #\c 6 7 8 9 0))
      (if (characterp var) 0 var))
 вернет #(1 2 3 4 5 0 0 0 6 7 8 9 0)

 (foreach (x in (list 'a 'b 'c))
      (format t "~a " x))
 напечатает
 A B C
 и вернет (NIL NIL NIL) т.к. format стандартно возвращает NIL



Основной каркас стащил с cl-cookbook.sourceforge.net, кстати.

upd: добавил возможность подставлять вместо expression несколько форм, которые будут последовательно вычисляться, не оборачивая их в progn - просто сделал expression &rest аргументом, и в map в лямбде вместо ,expression - ,@expression. ,@ - раскрывает аргумент-список. Лямбда-формы уже содержат implicit progn вроде; по крайней мере, работает как надо
upd2: определение типа теперь в рантайме,  вместо format в выдаче ошибки теперь error, а символ in заменен на :in во избежание конфликтов символов в разных пакетах
Link23 отписалось|Отписаться

navigation
[ viewing | most recent entries ]
[ go | earlier ]