?

Log in

No account? Create an account
e1m1: The Slipgate Complex [entries|archive|friends|userinfo]
bioh

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Сентябрь 10, 2011

GTFL - A Graphical Terminal For Lisp [сент. 10, 2011|10:01 pm]
bioh
[Tags|, , , ]

GTFL представляет собой надстройку над веб-сервером HUNCHENTOOT и предоставляет механизм для отправки контента для клиента, которым является обычная html-страница и немного js-кода, с помощью HT-SIMPLE-AJAX.

Такой механизм позволяет наглядно визуализировать различные структуры данных, что может помочь в отладке. Но следует понимать, что GTFL это не готовое решения для визуализации ваших структур данных, а лишь инструмент, который умеет примерно следующее:

  • отправить текст клиенту с помощью функции gtfl-out (с помощью разметки CL-WHO);
  • изменить или добавить содержимое элемента с указанным id на странице (replace-element-content/append-to-element). Клиент каждые 200мс обновляет содержимое страницы;
  • отправить сгенерированный html в стандартный вывод/строку или создать анонимную функцию, которая будет его возвращать (макросы: who, who2s, who-lambda);
  • создать элемент на странице с заданным id, который может свернут/развернут (make-expandable/collapsable-element);
  • создать ссылку, которая будет сворачивать/разворачивать элемент с указанным id (make-expand/collapse-link);
  • создать узел с дочерними элементами (draw-node-with-children).

1.1 Установка

Самый простой способ - установка с помощью quicklisp, о том как пользоваться им замечательно описано здесь.

(ql:quickload "gtfl")

1.2 Поддержка браузеров

  • Firefox (version > 3.0) on Mac, Windows, Linux and others
  • Safari (version > 3.0) on Mac and Windows
  • Chrome (version > 0.x) on Windows
  • Opera (version > 9.5) works as well, but the output of html-pprint looks very bad.

1.3 Пример использования

(require 'gtfl)

(in-package :gtfl)

(start-gtfl)

(defparameter *example-tree*
  '("top node."
    ("child node one with three children"
     ("first out of three children") ("second out of three children") ("third out of three children"))
    ("child node two with one child"
     ("very long text. very long text. very long text. very long text.
       very long text. very long text. very long text."))))

(defun draw-node (string)
  (who
   (:div :style "padding:4px;border:1px solid #888;margin-top:4px;margin-bottom:4px;background-color:#eee;"
         (princ string))))

(defun draw-tree (tree)
  (draw-node-with-children
   (who-lambda (draw-node (car tree)))
   (mapcar #'(lambda (x) (who-lambda (draw-tree x))) (cdr tree))))

(defun draw-cell (obj)
  (cond
    ((null obj) (who-lambda (draw-node "nil")) (princ obj))
    ((atom obj) (who-lambda (draw-node obj)) (princ obj))
    ((consp obj) (draw-node-with-children (who-lambda (draw-node "cons"))
                                                      (list (who-lambda (draw-cell (car obj)))
                                                            (who-lambda (draw-cell (cdr obj))))))))

(gtfl-out (draw-tree *example-tree*))
(gtfl-out (draw-cell '(symbol 2 another-one 4.5 "some string")))
(gtfl-out (draw-cell (cons *example-tree* '(symbol 2 another-one 4.5 "some string"))))

Теперь откроем http://localhost:8000/ и получим примерно следующее:

Более сложные примеры использования можно посмотреть тут и тут, а монструозные схемы например тут.

Ссылка3 комментария|Оставить комментарий

navigation
[ viewing | Сентябрь 10, 2011 ]
[ go | На день назад|На день вперёд ]