LINUX.ORG.RU

Сообщения monk

 

Racket и анафора

Я правильно понимаю, что реализация aif будет выглядеть как-то так:

(provide it aif)

(define it #f)

(define (set-it! val) (set! it val))

(define-syntax aif
  (syntax-rules ()
    [(aif cond if-true if-false)
     (begin (set-it! cond)
            (if it if-true if-false))]))

Или можно как-то красивее?

 ,

monk
()

ООП. Как представляете себе идеальную реализацию?

Я знаю как минимум 4 слабо совместимых друг с другом понятия ООП:

  • С++: класс = неймспейc, вызов метода через точку,
  • CLOS: класс = идентификатор + наследование, тело метода определяется по классу всех параметров (а не только первого), методы доопределяются модификаторами :after :before :around.
  • Racket: класс = first-class object, как и функция, соответственно, может доопределяться по месту и не иметь имени.
  • Haskell: классы типов как наборы операций над типам (которые можно считать эквивалентными классам других языков)

Хотелось бы узнать, какой подход вам ближе и почему. А также, можно ли из упомянутых видов получить некую «идеальную реализацию» и какой синтаксис мог бы быть у такой реализации.

 , ,

monk
()

Typed Racket. Что я делаю не так?

Хочу ускорить пример кода

(define (test)
  (letrec ([oddp (lambda (x)
                   (if (zero? x) #f
                       (evenp (sub1 x))))]
            [evenp (lambda (x)
                    (if (zero? x) #t
                        (oddp (sub1 x))))])
    (oddp 400000000)))

потому как выполняется он 30-35 секунд, в то время как эквивалентный на sbcl:

(defun test ()
           (labels ((oddp1 (x)
                      (if (zerop x) nil
                          (evenp1 (1- x))))
                    (evenp1 (x)
                      (if (zerop x) t
                          (oddp1 (1- x)))))
             (oddp1 400000000)))

всего лишь 4-8 секунд, а в варианте

(defun test ()
           (labels ((oddp1 (x) (declare (fixnum x))
                      (if (zerop x) nil
                          (evenp1 (1- x))))
                    (evenp1 (x) (declare (fixnum x))
                      (if (zerop x) t
                          (oddp1 (1- x)))))
             (oddp1 400000000)))
вообще 2-3 секунды.

Пытаюсь сделать типы в Racket:

(define (test)
  (letrec: ([oddp : (Fixnum -> Boolean) 
                  (λ: ([x : Fixnum])
                   (if (zero? x) #f
                       (evenp (sub1 x))))]
            [evenp : (Fixnum -> Boolean) 
                   (λ: ([x : Fixnum])
                    (if (zero? x) #t
                        (oddp (sub1 x))))])
    (oddp 400000000)))

Получаю ошибку: Type Checker: Expected Fixnum, but got Integer in: (sub1 x)

Что я делаю не так и как правильно?

 ,

monk
()

Существует ли Common Lisp с полнофункциональным call/cc?

cl-cont видел: 1. delimited 2. требует перекомпиляции с ним всего, из чего используешь продолжения.

Видел хак для SBCL. С ограничениями: функции должны быть без параметров и связанных переменных.

Есть ли нормально работающая версия (может в расширениях у каких-нибудь коммерческих лиспов)?

 , ,

monk
()

Как в DrRacket перейти к определению функции?

Есть модуль lib.

(provide foo)
...
(define (foo ...
...

Есть другой модуль, который его использует

(require lib)

(foo 

Как перейти к определению foo? Или хотя бы как увидеть по нему документацию, параметры...

P.S. Аналогов CL-ных docstring'ов в racket нет?

 ,

monk
()

Я верно понимаю, что в scheme нельзя макрос выполнять изнутри макроса?

На лиспе есть вот такой код

(defmacro template (vars args &body body)
  (let ((%do (gensym "DO")) 
        (%vars (gensym "VARS")))
    (cond
      ((null vars)
       `(macrolet ((,%do () ,@body))
          (,%do)))
      ((consp vars)
       `(template ,%vars ,args
          (destructuring-bind ,vars ,%vars
            ,@body)))
      (t `(macrolet ((,%do ()
                       `(progn
                          ,@(mapcar (lambda (,vars) ,@body)
                                    ',args))))
            (,%do))))))

Используется, например, так:

(template 
  ((type word) (list :in) (string :across) (vector :across))
  `(defmethod process ((l ,type))
     (loop :for i ,word l :collect (process-element i)))

Суть макроса template в том, что создаётся анонимный макрос по переданному коду и тут же выполняется. Можно ли такое сделать в Scheme или Racket?

 ,

monk
()

Пакеты. Как должно быть?

Как бы вы сделали, если бы проектировали систему пакетов с нуля. Или существующий вариант идеален?

 ,

monk
()

А бывает ли в Common Lisp объектная модель на сообщениях?

Как в ruby/smalltalk.

Или умерла вместе с Lisp machines/Genera/Flavors?

Хотелось бы знать, почему CLOS вытеснил все альтернативы. Плюс у сообщений в том, что для разных классов сообщения не обязаны иметь одинаковое количество параметров.

Ну и, в том же Racket, классы/объекты как раз работают на сообщениях.

 

monk
()

Google вводит цензуру в Интернете

В пятницу, 23 сентября, Google закрыл без объяснения причин популярный англоязычный блог ActivistPost.Com (свыше миллиона месячных просмотров), специализирующийся на новостях.

При попытке владельцев ресурся поднять сайт на другом аккаунте сервиса blogger.com, он также немедленно был заблокирован, поэтому речь не может идти о техническом сбое.

Вот такая она, корпорация добра...

Подробности (англ)

Перемещено Dimez из Интернет

monk
()

Emacs на Common Lisp и GTK3

Может, кончено, я плохо гуглю и кто-то уже такое написал, но я не нашёл.

В общем сделал http://common-lisp.net/viewvc/gtk-cffi/cl-emacs/. В требованиях биндинг к GTK3 http://common-lisp.net/viewvc/gtk-cffi и пачка стандартных библиотек: babel, flexi-streams, iterate, alexandria, split-sequence

Выглядит оно так:

Справа сверху консоль для ввода REPL. Пока реализованы клавиатурные комбинации «C-x C-c», ":C-x C-f", «C-x C-s». Ну и define-global-key соотвественно.

REPL позволяет пытаться ввести любую галиматью без обрушения редактора (на скриншоте есть примеры). Выполнение производится по кнопке Return, если сбалансированы скобки. Если не сбалансированы, то в статусе увидите чего не хватает.

В планах прикрутить M-. из SLIME, отступы, автодополнение и раскраску кода. В дальних планах сделать repl асинхронным, чтобы длинная команда не блокировала графический интерфейс.

monk
()

[Lisp & GTK3] Не работает FFI в SBCL & CMUCL

Вот минимальный кусок кода

(asdf:oos 'asdf:load-op :cffi)
(in-package :cffi)

(load-foreign-library "/usr/lib/libgtk-3.so.0.0.11")

(foreign-funcall "gtk_init" :int 0 :pointer (foreign-alloc :string :initial-element "program") :void)

(defvar *window*)

(setq *window* (foreign-funcall "gtk_window_new" :int 0 :pointer))

(foreign-funcall "g_signal_connect_data" :pointer *window* :string "destroy" :pointer (foreign-symbol-pointer "gtk_main_quit") :pointer (null-pointer)  :pointer (null-pointer) :int 0 :void)

(foreign-funcall "gtk_widget_show" :pointer *window* :void)

(foreign-funcall "gtk_main" :void)

После запуска отрисовывается окно, но при наведении на него мышки, вылетает с ошибкой деления на 0. В clisp и ccl всё работает без ошибок. В GTK-2 — тоже.

Кто-нибудь может помочь или посоветовать куда копать (пробовал блокировать обработчики motion_notify_event, enter_notify_event, focus_in_event, proximity_in_event — не помогло: разве что запускаются они непосредственно перед тем самым делением на ноль)

monk
()

HOWTO Emacs @ Android ?

Как скомпилировать / запустить emacs на android? Желательно в графическом режиме (чтоб мышка работала).

Минимум: работа Ctrl, Alt и Unicode (хотя бы для русского).

monk
()

Iptables & conntrack

Как может получиться такая ситуация?

В /proc/net/ip_conntrack дофига записей такого вида:

tcp 6 429831 ESTABLISHED src=10.0.2.148 dst=10.0.2.88 sport=37842 dport=80 [UNREPLIED] src=10.0.2.88 dst=10.0.2.148 sport=80 dport=37842 use=1

tcp 6 427133 ESTABLISHED src=10.0.2.148 dst=10.0.2.167 sport=36697 dport=80 [UNREPLIED] src=10.0.2.167 dst=10.0.2.148 sport=80 dport=36697 use=1

10.0.2.148 - мой адрес, dport=80 во всех строках. Всего примерно 15000 записей. И вообще, как может быть ESTABLISHED & UNREPLIED на tcp одновременно?

monk
()

RSS подписка на новые темы