bioh (bioh) wrote,
bioh
bioh

GTFL - A Graphical Terminal For Lisp

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/ и получим примерно следующее:

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

Tags: debug, gtfl, lisp, programming
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 3 comments