Ответ 1
Взгляните на LTK, который является оберткой для взаимодействия с инструментарием TK GUI. Это довольно легко начать с него, и этого достаточно для простого приложения.
Я разработал GUI ранее в Matlab, используя панель инструментов GUI, и сейчас я использую общий lisp для моего проекта. Мне нужно разработать графический интерфейс, который, вероятно, может иметь кнопку, радиокнопку, окно фигуры и т.д.
Я просто хочу знать, возможно ли это сделать в Common lisp и есть ли панели инструментов, библиотеки, которые довольно просты в использовании и изучении. У меня нет сильного фона программирования, поэтому я постараюсь избежать, если возможно, передовых вещей.
Большое вам спасибо заранее.
Взгляните на LTK, который является оберткой для взаимодействия с инструментарием TK GUI. Это довольно легко начать с него, и этого достаточно для простого приложения.
Второе предложение использовать LTK.
Однако, если ваши требования растут сверх того, что предоставляет LTK (и вы можете позволить себе потратить некоторое время на изучение базового JavaScript + HTML + CSS), вероятно, это означает, что вы не избегаете "продвинутых вещей", которые вы упомянули в вопросе), вы можете найти его полезно для создания веб-интерфейса для вашего приложения.
Поскольку я не мог найти бесплатную достойную альтернативу написанию портативных графических интерфейсов в CL, я решил написать веб-приложения вместо настольных приложений (и использовать их в качестве настольных приложений, то есть запустить сервер на компьютере, где я имею в виду используйте приложение, откройте страницу в браузере и обработайте ее как настольное приложение, если что-то, что я не могу сделать в JavaScript, например, доступ к сети и т.д., я делаю это на сервере). У этого есть преимущество в большой переносимости (прямо сейчас это означает, что я разрабатываю на Linux с использованием SBCL и развертываю в Windows с помощью Clozure CL, и он отлично работает до сих пор).
В настоящее время я очень доволен прогрессом в отношении такого приложения, используя Hunchentoot (для размещения контента) + Parenscript (для CLize JavaScript) + JQuery (чтобы приручить несовместимости браузера) + JQueryUI (для ручного написания пользовательского интерфейса в браузерах). Не беспокойтесь о производительности JS, довольно эффектно в наши дни (ну, если вы можете позволить игнорировать IE раньше IE9 и использовать последний браузер). Несколько недель назад я написал простое приложение типа hello world-type, используя все эти (за исключением JQueryUI, но это легко добавить); это может быть полезно в качестве минимального примера того, что я имею в виду.
Если вы находитесь в среде Unix-ish, вы можете попробовать cl-gtk2 или commonqt или даже CLIM. Кроме того, ваш выбор инструментария пользовательского интерфейса зависит от реализации Common Lisp, которую вы используете. Lisp Works и Allegro CL приходят со своими собственными UI, которые работают (более или менее) независимо от платформы.
Я играл с некоторыми из предложений до сих пор, по моему опыту, привязки Qt и Gtk выполняют свою работу, но они все еще чувствуют себя немного C/С++ - ish, что мне не нравится. Я играл с бесплатной версией LispWorks, и я был очень впечатлен CAPI, но у меня нет необходимости (и способности) инвестировать в коммерческую лицензию на данный момент, поэтому я никогда не делал ничего, кроме игры с примером Программы.
Я заставлю рекомендацию изучить веб-интерфейсы. Насколько мне не нравится программирование браузера, в наши дни есть много инструментов, чтобы сделать его доступным и, возможно, даже приятным, и Restas (основа, основанная на Hunchentoot) довольно мила.
Помимо уже упомянутого LTK (который всегда работал отлично для меня), я также люблю Cells-Gtk, потому что Tilton Cells - это, на мой взгляд, хороший подход к написав GUI-код. (Тем не менее, LTK может быть проще начать с.)
Например, вот какой-то код для очень простого конвертера Fahrenheit/Celsius (и наоборот), который я написал, когда я только начинал с Cells-Gtk:
(defun fahrenheit->celsius (fahrenheit/string)
(princ-to-string (handler-case
(* (- (read-from-string fahrenheit/string nil) 32) 5/9)
(error () "NaN"))))
(defun celsius->fahrenheit (celsius/string)
(princ-to-string (handler-case
(+ (* (read-from-string celsius/string nil) 9/5) 32)
(error () "NaN"))))
(defmd celsius-fahrenheit-converter (gtk-app)
:title "°C <-> °F"
:position :center
:kids
(kids-list?
(mk-vbox
:kids
(kids-list?
(mk-hbox
:kids
(kids-list?
(mk-entry :md-name :celsius
:init "0"
:text (c? (fahrenheit->celsius (widget-value :fahrenheit))))
(mk-label :text "°C")))
(mk-hbox
:kids
(kids-list?
(mk-entry :md-name :fahrenheit
:text (c? (celsius->fahrenheit (widget-value :celsius))))
(mk-label :text "°F")))))))
Нет кнопки "Рассчитать" или что-то в этом роде - просто измените значение одного поля ввода, а другое будет обновляться "на лету". Как вы можете видеть, Cells автоматически обрабатывает изменения состояния виджета - нужно указать только правильную "сантехнику".
(Этот код несколько лет, и у меня нет установки Cells-Gtk, чтобы проверить его ATM, но он работал правильно, когда я его написал.)