Как сделать графический интерфейс с использованием Lisp: DrScheme или Common Lisp - PullRequest
12 голосов
/ 06 декабря 2011

Или базовую работу, которую необходимо выполнить для создания графического интерфейса. Я знаю основные компоненты GUI, но с чего начать. Я просто человек для самообучения, и я читаю «Как разработать программу» (HtDP) в конце книги, которую автор предполагает, что знание компьютерного интерфейса GUI и CGI необходимо для программиста. Информация о последних двух легко найти. Но, похоже, есть небольшая книга о том, как создать графический интерфейс. Я думаю, может быть, это слишком "низко" в процессе разработки компьютерной программы, что мало кого даже волнует.

Ответы [ 4 ]

10 голосов
/ 06 декабря 2011

Документация для программирования GUI в DrRacket (название текущей версии DrScheme) находится здесь: http://docs.racket -lang.org / gui / index.html

Так какчитая HTDP, это, вероятно, лучший вариант для вас прямо сейчас.

9 голосов
/ 07 декабря 2011
  • Если вы хотите просто сделать простой графический интерфейс в Common Lisp, ваш лучший Выбор, на мой взгляд, является ЛТК, который является интерфейсом высокого уровня для Библиотека сценариев Tcl / Tk
  • Есть много других вариантов, но они требуют некоторых видение того, что вы пытаетесь достичь. Если вы хотите использовать один из широко распространенных наборов инструментов GUI (GTK или Qt) - CL-GTK2 и CommonQt. Но вы должны прежде всего хорошо понять, как эти инструментарий работы
  • LispWorks предоставляет очень сложную библиотеку графического интерфейса пользователя CAPI, который кроссплатформенный
  • На Mac ClozureCL есть хорошие Какао-привязки
  • Наконец, есть полноценное решение CL для GUI - McCLIM - который очень гибкий, но довольно сложный

Кроме того, если вы хотите понять GUI и изучить его с теоретической точки зрения, вы должны узнать о различных GUI-шаблонах, таких как MVC, Model2, MVVM и т. Д. Я не знаю ни о какой GUI-инфраструктуре в Лисп, реализация таких шаблонов, поэтому такой проект может быть интересным опытом обучения ...

7 голосов
/ 12 декабря 2011

Есть легкая библиотека для написания простых графических программ через 2htdp / universe.См .: Как проектировать миры .

Основная идея заключается в том, что современные графические библиотеки в значительной степени ориентированы на события: вы взаимодействуете с внешним миром, реагируя на события.Если вы посмотрите на это достаточно внимательно, библиотека юниверсов является реализацией модели MVC: мир - это «Модель», объект для рисования - «Вид», а все другие обработчики событий - «Контроллер».

Если вы хотите работать с более низкоуровневыми элементами в Racket, вы можете использовать библиотеки racket / gui.Они имеют справочную документацию в Инструментарий графического интерфейса Racket .Вот небольшой пример, который использует библиотеку:

#lang racket

(require racket/gui/base
         2htdp/image
         (only-in mrlib/image-core render-image))

;; The state of our program is a number.
(define state 0)

;; On a timer tick, increment the state, and refresh the canvas.
;; tick!: -> void
(define (tick!)
  (set! state (add1 state))
  (send THE-CANVAS refresh))


;; When a canvas paints itself, use the following:
;; paint: canvas% dc<%> -> void
(define (paint! a-canvas my-drawing-context)
  (define my-new-scene (text (format "I see: ~a" state) 20 'black))
  ;; Note: we force the canvas to be of a particular width and height here:
  (send a-canvas min-client-width (image-width my-new-scene))
  (send a-canvas min-client-height (image-height my-new-scene))
  (render-image my-new-scene my-drawing-context 0 0))


;; Here, we initialize our graphical application.  We create a window frame...
;; THE-FRAME: frame%
(define THE-FRAME (new (class frame%
                         (super-new)
                         ;; When we close the frame, shut down everything.
                         (define/augment (on-close)
                           (custodian-shutdown-all (current-custodian))))
                       [label "Example"]))


;; and add a canvas into it.
;; THE-CANVAS: canvas%
(define THE-CANVAS (new (class canvas%
                          (super-new)

                          ;; We define a key handler.  Let's have it so it
                          ;; resets the counter on a key press
                          (define/override (on-char key-event)
                            (when (eq? (send key-event get-key-code) 'release)
                              (set! state 0)
                              (send THE-CANVAS refresh))))
                        [parent THE-FRAME]
                        [paint-callback paint!]))

;; We get the frame to show on screen:
(send THE-FRAME show #t)

;; Finally, we set up a timer that will call tick! on every second.
(define THE-TIMER (new timer% 
                       [notify-callback tick!]
                       [interval 1000]))
2 голосов
/ 30 августа 2015

Недавняя статья о текущем состоянии экосистемы Common Lisp гласит: CommonQt plus Qtools - это путь, которым мы пользуемся сегодня.

...