2016-12-12 7 views
3

Я пытаюсь создать новый элемент GUI в текстовом окне DrRacket, например, пиктограммах или синтаксических объектах. Насколько я могу судить, самый стандартный способ сделать это - с snip%.Создание нового snip% с помощью Racket

К сожалению, документация для creating new snips, хотя и всеобъемлющая, немного непроницаема и оставляет некоторые вопросы, на которые нужно ответить.

Для начала, в чем разница между snip% и snip-class%? Почему их нужно разделить на два класса, а не просто объединить в один класс? Это потому, что несколько snips будут использовать один класс snip?

Второе, что такое snip-reader<%>? Не только почему это должен быть отдельный класс, но почему модуль, который должен быть установлен, должен быть установлен? Если это действительно необходимо для нового класса, почему его нельзя просто передать напрямую. Зачем проходить весь этот процесс построения, а затем разбирать строку формы: "(lib ...)\n(lib ...)"?

Я имею в виду, что для этого дизайна могут возникнуть какие-либо причины, и это может быть просто остатком старого API. Если да, то кто-нибудь думал о создании нового более последовательного API? Или, если есть причина для этого дизайна, можете ли вы, пожалуйста, рассказать мне, что это такое, поскольку документы, похоже, не так понятны.

Я имею в виду, на данный момент, я могу скопировать/вставить sample given in the docs на создание нового snip. Но мне сложно понять, что происходит здесь, поэтому я могу правильно их использовать.

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

Я знаю, что это не необходимость быть установлена ​​как библиотека сама по себе, но в документации, кажется, сильно толкать вас в этом направлении.

+0

Я подозреваю, что snip-reader% имеет класс, отдельный от snip%, чтобы обрабатывать snips в программах, отличных от gui (обратите внимание, что snip-reader% принадлежит wxme). – soegaard

+0

FWIW: тот же шаблон дизайна используется в 'editor%' vs 'editor-class%' – soegaard

+0

Я не могу найти 'editor-class%', но я могу найти 'editor-data-class%', is что вы тоже имеете в виду? –

ответ

0

Хорошо, я думаю, что, наконец, нашел ответ. В широком смысле:

Класс snip% включает методы рисования среза, рассказывая редактору, сколько места зарезервировано для изображения, и обработки событий, таких как щелчки мыши.

Далее класс snip-class% используется для кодирования и декодирования снимков. Это должен быть отдельный класс, потому что, когда он сохраняется в файле, редактору нужно кодировать, какой тип он есть, и по понятным причинам он не может просто поставить литерал snip%. Значение, которое он хранит в файле, - это «имя класса» snip-class%. Это может быть все, и до тех пор, пока редактор имеет имя класса, связанное с snip-class%, его можно загрузить. Кроме того, если он имеет форму "(lib ...)" или "(lib ...) (lib ...)" Racket просто автоматически загрузит его в список для вас.

Ничего не требуется для установки как такового, это самый простой способ этого. В противном случае вам нужно вручную сообщить редактору, как обрабатывать snip, прежде чем загружать файл.