LINUX.ORG.RU

Сообщения monk

 

имена экспортируемых функций в Racket

Форум — Development

Как принято именовать экспортируемые функции в библиотеке.

Для CL, например, есть два варианта:

  • С префиксом: symbol-function, dllist-append
  • Без префикса (считается, что «префиксом» будет пакет): gtk:add, iterate:for

Согласно Google style guide предпочитается вариант без префикса.

----

В Racket без префикса получаем, например, невозможность одновременно импортировать racket/contract и ffi/unsafe (в обоих есть ->). Пакетов нет. Есть (require (prefix-in ...)), но требует дополнительных телодвижений от пользователя библиотеки.

И что будет, если в импортируемой библиотеке случайно перекрывается символ из racket? Программа, использующая этот символ молча ломается?

В общем, вопрос такой: есть какие-нибудь guidelines для именования символов библиотек?

 ,

monk
()

Откуда у Scheme такие макросы?

Форум — Development

Существует ли книга, в которой написано, почему макросы в scheme такие странные.

Логика макросов CL понятна. Всё есть список, дальше программист сам разберётся.

Часть решений в Scheme тоже: гигиена по-умолчанию, паттерны.

Но зачем нужна отдельная от списка структура кода (syntax)? Почему этот syntax, будучи созданным внутри макроса не привязывается автоматически к строке, где был использован макрос (вместо #' #` приходится писать syntax/loc)?

 ,

monk
()

Как узнать откуда ошибка в DrRacket?

Форум — Development

Есть программа. В ней кусок

(require "loadlib.rkt")
...
(define-gobject* g-type-name (_fun _ulong -> string))
...

Допустил опечатку. Вместо _string написал string. Проверка синтаксиса проходит без предупреждений. При загрузке получаю сообщение об ошибке

. . loadlib.rkt:46:8: ffi-call: contract violation
  expected: ctype?
  given: #<procedure:string>
  argument position: 3rd
  other arguments...:
   #<ffi-obj>
   '(#<ctype:uint32>)
   #f
   #f
   #f

В loadlib.rkt:46:8 находится определение макроса define-gobject*. Причём он распаковывается в команду (define-gobject g-type-name (_fun _ulong -> string) #:c-name g_type_name) и никаких ffi-call там нет.

Как добиться от Racket нормальных сообщений об ошибке? Как минимум, нужно место применения макроса, а не его определения. Угадывать по тексту ошибки, в каком именно определении функции неверный аргумент, удовольствие ниже среднего.

 

monk
()

Идентификаторы, как правильно переводить?

Форум — Development

Предположим есть проект с русскоязычными программистами. OpenSource. GPL. Будет публичный.

Как лучше именовать идентификаторы процедур, таблиц, переменных.

  • По-русски. СУБД и язык поддерживают Unicode. Можно писать «SELECT Житель, Город FROM Население», if (РассчитатьНДФЛ(...)) и так далее.
  • Транслитом.
  • Полностью переводить: СтавкаНДС -> VATrate, РассчитатьНДФЛ -> CalculatePersonalTax ...

Как лучше и почему?

 стиль программирования

monk
()

Зачем нужна свобода 2?

Форум — Talks

Свобода 0, 1 — очевидно. Позволяет пользователю сделать продукт для себя более удобным. Свобода 3 — тоже. Если я внёс модификацию и она полезна, то я имею право показать, что я внёс.

Зачем свобода 2? RHEL и Mozilla её обходят. BolgenOS — порицается (хотя лицензия не нарушена). Найти разработчиков для свободного проекта почти невозможно, так как результат можно продать только один раз. Дальше продавать может покупатель. Соответственно, остаётся только заказная разработка или чистый for fun. Ну или писать так, чтобы можно было хорошо заработать на поддержке :-)

 

monk
()

В чём плюсы image-based разработки?

Форум — Development

archimag сказал, что image-based разработка — для него основное достоинство Common Lisp. В варианте SLIME. То есть не формируем в конце исходники из образа, а меняем исходники и на каждом шагу чуть-чуть меняем образ.

Имхо, image-based заставляет смотреть на программу не как на результат компиляции файлов исходников, а как на живой REPL, который иногда можно подкрутить для получения результата.

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

С другой стороны, предполагаю, blub-парадокс. Поэтому хочу узнать, что же особенно хорошего в image-based разработке с точки зрения тех, кто считает image-based лучше чем file-based.

 , ,

monk
()

Снова макросы Racket

Форум — Development

Пытаюсь использовать макрос

(define-syntax-rule (with-template ([var ...] [form ...] ...) body ...)
  (begin (define-syntax-rule (inner var ...) (begin body ...))
         (inner form ...) ...))

для описания пачки однотипных макросов

(with-template 
 ([src dst]
  [define-gi define-gi*]
  [define-gtk define-gtk*])
(define-syntax (dst stx)
  (syntax-case stx ()
    [(dst id params ...)
     (let ([new-id (string->symbol (string-replace (symbol->string (syntax-e #'id)) "-" "_"))])
       #`(src id params ... #:c-id #,new-id))])))

Получаю очень странную ошибку main.rkt:38:20: syntax: no pattern variables before ellipsis in template at: ... in: (begin (define...syntax-e (syntax id))) "-" «_»)))) (quasisyntax (src id params ... #:c-id (unsyntax new-id))))))))

При том, что

(define-syntax (define-gtk* stx)
  (syntax-case stx ()
    [(define-gtk* id params ...)
     (let ([new-id (string->symbol (string-replace (symbol->string (syntax-e #'id)) "-" "_"))])
       #`(define-gtk id params ... #:c-id #,new-id))]))
работает прекрасно

Что я ещё не понял про рэкетовские макросы?

 ,

monk
()

Scribble. Помогите понять

Форум — Development

Пытаюсь написать документацию

#lang scribble/manual
@(require (for-label racket))

@title{GObject Introspection}

This is Gobject FFI. 

Usage example:

@racketblock[
(gi-ffi gtk "Gtk")
(let ([window (gtk 'window 'new)])
  (window 'show))
]

DrRacket в строке состояния пишет «+: contract violation expected: number? given: #f argument position: 1st other arguments...: 0»

Если нажимаю «Проверить синтаксис» вообще всё намертво виснет. Точнее не совсем намертво: могу открыть другой файл, а вот в редактируемом пропадает весь текст и ничего в нём написать нельзя (виснет как бы одна вкладка).

Что делать?

 

monk
()

Racket и анафора

Форум — Development

Я правильно понимаю, что реализация 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
()

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

Форум — Development

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

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

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

 , ,

monk
()

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

Форум — Development

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

(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?

Форум — Development

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

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

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

 , ,

monk
()

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

Форум — Development

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

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

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

(require lib)

(foo 

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

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

 ,

monk
()

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

Форум — Development

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

(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
()

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

Форум — Development

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

 ,

monk
()

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

Форум — Development

Как в ruby/smalltalk.

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

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

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

 

monk
()

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

Форум — Talks

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

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

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

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

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

monk
()

Emacs на Common Lisp и GTK3

Форум — Development

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

В общем сделал 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

Форум — Development

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

(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 ?

Форум — Development

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

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

monk
()

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