Предположим, что программа — интерфейс к БД.
Насколько адекватно будет во время компиляции анализировать схему и на её основании генерировать классы, поля, контракты?
Или хотя бы также (во время компиляции) проверять корректность написанных запросов.
Как принято именовать экспортируемые функции в библиотеке.
Для CL, например, есть два варианта:
С префиксом: symbol-function, dllist-append
Без префикса (считается, что «префиксом» будет пакет): gtk:add, iterate:for
Согласно Google style guide предпочитается вариант без префикса.
----
В Racket без префикса получаем, например, невозможность одновременно импортировать racket/contract и ffi/unsafe (в обоих есть ->). Пакетов нет. Есть (require (prefix-in ...)), но требует дополнительных телодвижений от пользователя библиотеки.
И что будет, если в импортируемой библиотеке случайно перекрывается символ из racket? Программа, использующая этот символ молча ломается?
В общем, вопрос такой: есть какие-нибудь guidelines для именования символов библиотек?
Существует ли книга, в которой написано, почему макросы в scheme такие странные.
Логика макросов CL понятна. Всё есть список, дальше программист сам разберётся.
Часть решений в Scheme тоже: гигиена по-умолчанию, паттерны.
Но зачем нужна отдельная от списка структура кода (syntax)? Почему этот syntax, будучи созданным внутри макроса не привязывается автоматически к строке, где был использован макрос (вместо #' #` приходится писать syntax/loc)?
В loadlib.rkt:46:8 находится определение макроса define-gobject*. Причём он распаковывается в команду (define-gobject g-type-name (_fun _ulong -> string) #:c-name g_type_name) и никаких ffi-call там нет.
Как добиться от Racket нормальных сообщений об ошибке? Как минимум, нужно место применения макроса, а не его определения. Угадывать по тексту ошибки, в каком именно определении функции неверный аргумент, удовольствие ниже среднего.
Свобода 0, 1 — очевидно. Позволяет пользователю сделать продукт для себя более удобным. Свобода 3 — тоже. Если я внёс модификацию и она полезна, то я имею право показать, что я внёс.
Зачем свобода 2? RHEL и Mozilla её обходят. BolgenOS — порицается (хотя лицензия не нарушена). Найти разработчиков для свободного проекта почти невозможно, так как результат можно продать только один раз. Дальше продавать может покупатель. Соответственно, остаётся только заказная разработка или чистый for fun. Ну или писать так, чтобы можно было хорошо заработать на поддержке :-)
archimag сказал, что image-based разработка — для него основное достоинство Common Lisp. В варианте SLIME. То есть не формируем в конце исходники из образа, а меняем исходники и на каждом шагу чуть-чуть меняем образ.
Имхо, image-based заставляет смотреть на программу не как на результат компиляции файлов исходников, а как на живой REPL, который иногда можно подкрутить для получения результата.
В результате тестовые случаи, проверяемые в REPL зачастую невоспроизводимы, и работа в REPL, если в процессе изменялся код, не гарантирует работу при загрузке из тех же исходников в чистый образ.
С другой стороны, предполагаю, blub-парадокс. Поэтому хочу узнать, что же особенно хорошего в image-based разработке с точки зрения тех, кто считает image-based лучше чем file-based.
DrRacket в строке состояния пишет «+: contract violation expected: number? given: #f argument position: 1st other arguments...: 0»
Если нажимаю «Проверить синтаксис» вообще всё намертво виснет. Точнее не совсем намертво: могу открыть другой файл, а вот в редактируемом пропадает весь текст и ничего в нём написать нельзя (виснет как бы одна вкладка).
Я знаю как минимум 4 слабо совместимых друг с другом понятия ООП:
С++: класс = неймспейc, вызов метода через точку,
CLOS: класс = идентификатор + наследование, тело метода определяется по классу всех параметров (а не только первого), методы доопределяются модификаторами :after :before :around.
Racket: класс = first-class object, как и функция, соответственно, может доопределяться по месту и не иметь имени.
Haskell: классы типов как наборы операций над типам (которые можно считать эквивалентными классам других языков)
Хотелось бы узнать, какой подход вам ближе и почему. А также, можно ли из упомянутых видов получить некую «идеальную реализацию» и какой синтаксис мог бы быть у такой реализации.
Хотелось бы знать, почему CLOS вытеснил все альтернативы.
Плюс у сообщений в том, что для разных классов сообщения
не обязаны иметь одинаковое количество параметров.
Ну и, в том же Racket, классы/объекты как раз работают на сообщениях.
В пятницу, 23 сентября, Google закрыл без объяснения причин популярный англоязычный блог ActivistPost.Com (свыше миллиона месячных просмотров), специализирующийся на новостях.
При попытке владельцев ресурся поднять сайт на другом аккаунте сервиса blogger.com, он также немедленно был заблокирован, поэтому речь не может идти о техническом сбое.
Справа сверху консоль для ввода REPL. Пока реализованы клавиатурные комбинации «C-x C-c», ":C-x C-f", «C-x C-s». Ну и define-global-key соотвественно.
REPL позволяет пытаться ввести любую галиматью без обрушения редактора (на скриншоте есть примеры). Выполнение производится по кнопке Return, если сбалансированы скобки. Если не сбалансированы, то в статусе увидите чего не хватает.
В планах прикрутить M-. из SLIME, отступы, автодополнение и раскраску кода. В дальних планах сделать repl асинхронным, чтобы длинная команда не блокировала графический интерфейс.
После запуска отрисовывается окно, но при наведении на него мышки, вылетает с ошибкой деления на 0. В clisp и ccl всё работает без ошибок. В GTK-2 — тоже.
Кто-нибудь может помочь или посоветовать куда копать (пробовал блокировать
обработчики motion_notify_event, enter_notify_event, focus_in_event, proximity_in_event — не помогло: разве что запускаются они непосредственно перед тем самым делением на ноль)