LINUX.ORG.RU

Scheme SRFI-29

 ,


0

1

Как правильно его использовать?

В SRFI приведён пример:

(if (not (load-bundle! bundle-name))
                    (begin
                     (declare-bundle! bundle-name (cdr translation))
                     (store-bundle! bundle-name)))) 

Но ведь в этом случае, если translation будет изменён после первого запуска, то при запуске будет использоваться старая версия: (load-bundle! bundle-name) загрузит старую сохранённую версию и вернёт #t.

Просто писать declare-bundle!, а остальное игнорировать? Или делать макрос со сторонним эффектом времени компиляции?

★★★★★

Какой-то странный у тебя вопрос...

при запуске будет использоваться старая версия

На то он и пример, чтобы быть простым и не учитывать вот это всё. Дрочи как хочешь, в чём вопрос?

no-such-file ★★★★★ ()
Ответ на: комментарий от no-such-file

Дрочи как хочешь, в чём вопрос?

Интересуюсь, как принято.

Скажем, в gettext есть подробная пошаговая инструкция, где должны быть переводы, как с ними работать и что должно быть в исходниках программы.

А здесь то ли просто использовать declare-bundle! и localized-template. То ли считать srfi-29 мёртвым и пытаться сделать аналог gettext.

monk ★★★★★ ()
Ответ на: комментарий от monk

Не пойму, что тебе не понятно. Очевидно же что в принципе достаточно «declare-bundle! и localized-template». store и load для кэширования скомпилированных бандлов. Как ты будешь заниматься синхронизацией кэша — твои проблемы.

в gettext есть подробная пошаговая инструкция

gettext это вполне конкретная реализация, а srfi даёт только общий интерфейс.

no-such-file ★★★★★ ()
Ответ на: комментарий от no-such-file

Как ты будешь заниматься синхронизацией кэша — твои проблемы.

Но должно же быть какое-то типовое решение. А то ощущение, что дали eval-when, а документацию не дали...

monk ★★★★★ ()
Последнее исправление: monk (всего исправлений: 3)

Это вырожденный и очень абстрактный пример.

В спецификации не написано, как именно должны работать load-bundle! и store-bundle!, но есть 2 уточнения:

  • Эти функции должны сохранять и загружать бандлы вне Схемки. То есть подразумевается работа с чем-то вроде бд.
  • Если нет желания реализовывать — обе функции должны по-умолчанию всегда возвращать #f

Ответ на вопрос — или всегда возвращаешь #f, или заморачиваешься и реализуешь проверки на изменение данных.

xerx ()
Ответ на: комментарий от xerx

Ответ на вопрос — или всегда возвращаешь #f, или заморачиваешься и реализуешь проверки на изменение данных.

Вопрос не про то, как написать srfi-29. Вопрос про-то, как его использовать.

Скажем для gettext я должен указать

  setlocale (LC_ALL, "");
  bindtextdomain (PACKAGE, LOCALEDIR);
  textdomain (PACKAGE);
и всё будет правильно работаеть

Что написать для подключения srfi-29?

Написать

(load-bundle! bundle-name)
нельзя. load-bundle может возвращать всегда #f.

Написать

(if (not (load-bundle! bundle-name))
    (begin
      (declare-bundle! bundle-name translation)
      (store-bundle! bundle-name))))
нельзя, при обновлении программы перевод останется от старой программы.

Написать

(declare-bundle! bundle-name translation)
можно. Но зачем и когда нужно использовать load-bundle! и store-bundle! ?

Написать

(define-syntax localization
  (lambda (stx)
    (syntax-case stx ()
      ((_ bundle-name translation ...)
       (begin
         (declare-bundle! (syntax->datum #'bundle-name) (syntax->datum #'(translation ...)))
         (store-bundle! (syntax->datum #'bundle-name))
         #'(if (not (load-bundle! bundle-name))
               (declare-bundle! bundle-name '(translation ...))))))))
? Вроде правильно (при перекомпиляции перевод обновляется, без необходимости declare-bundle! не выполняется), но сторонний эффект при вызове макроса слегка напрягает.

Как правильно?

monk ★★★★★ ()
Последнее исправление: monk (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.