anton_nazarov: (Default)

Обещанного, конечно, три года ждут, но я справился раньше :)


Итак, второй пост про литературное программирование.


В предыдущем посте я описал историю и идеи литературного программирования, сейчас я хочу привести некоторые примеры.
Так как сейчас уже далеко не все пишут на Pascal или C, я не буду описывать системы WEB и CWEB, которые использует сам Дональд Кнут. Я приведу примеры с использованием системы noweb, которая не привязана к какому-то конкретному языку программирования, а может использоваться с практически любым языком.


Литературна программа в системе noweb состоит из следующих частей:



  • кусочков документации, которые начинаются со строки, состоящей из символа @ и продолжаются до следующего кусочка кода, вот так:


    @
    In the next code chunk <<Chunkname>> we compute something using the formula
    \begin{equation}
    y=f(x)
    \end{equation}
    This computation is crucial for the algorithm in the chunk <<OtherChunkName>>


  • кусочков кода.
    Они начинаются со строки, состоящей из названия,
    заключенного в двойные угловые скобки и знака присваивания и продолжаются до следующего кусочка документации:


        <<Chunkname>>=
        <<Chunk with the initialisation>>
        (define (f x)
          (* (sin x) (* x x)))
        (define y (f x))
        <<Debug output>>
        <<Save results to database>>
    


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


Вот тут можно посмотреть пример литературной программы на языке Scheme), а здесь и здесь - получающийся код и документацию.
После компиляции LaTeX-ом


    noweb LiterateLie.nw
    latex LiterateLie.tex
    bibtex LiterateLie
    latex LiterateLie.tex

получается очень сипатичный листинг, вполне подходящий для чтения человеком.


В этом файле изложены некоторые понятия теории алгебр Ли и приведены некоторые вычислительные алгоритмы теории представлений. Код написан на scheme), причём используется минимальное подмножество языка, так что программа должна работать на любой реализации scheme) на любой платформе (Windows, Unix, Palm OS, Pocket PC, iPhone, Java, Web browser).


Как видно, литературное программирование позволяет изменить порядок чтения на более естественный и получить удобную для человека документацию.
Кроме того, документация пишется в TeX-е, что позволяет излагать сложные научные концепции и включать математические формулы там, где они нужны.


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

anton_nazarov: (Default)
Поставил свежую версию slime из cvs, оказалось там теперь есть backend для mit-scheme, а ещё существует backend для clojure.
Про его установку и настройку здесь.
Clojure - это относительно новый диалект lisp, работающий на платформе java. В нём реализован интересный подход к многопоточности и сделан упор на функциональное программирование без побочных эффектов.

Так что теперь у меня работает sbcl, clojure и mit-scheme.



Чтобы использовать slime с этими языками надо в .emacs написать следующее:
(setq inferior-lisp-program "/usr/bin/sbcl") ; <-- insert your path
(add-to-list 'load-path "/home/anton/local/share/emacs/slime") ; <-- insert your path
(add-to-list 'load-path "/home/anton/local/share/emacs/slime/contrib") ; <-- insert your path
(require 'slime)
(require 'slime-autoloads)
(slime-setup '(slime-fancy slime-scratch slime-editing-commands slime-fuzzy slime-presentations slime-scheme))

(setq slime-net-coding-system 'utf-8-unix)
(setq common-lisp-hyperspec-root "/home/anton/programing/doc/lisp/HyperSpec/"); <-- insert your path

(setq slime-lisp-implementations
	     '((mit-scheme ("mit-scheme") :init mit-scheme-init)))

(add-to-list 'slime-lisp-implementations '(sbcl ("sbcl" "--core" "/home/anton/local/share/sbcl.core-for-slime")))

(defun mit-scheme-init (file encoding)
  (setq slime-protocol-version 'ignore)
  (format "%S\n\n"
	  `(begin
	    (load-option 'format)
	    (load-option 'sos)
	    (eval 
	     '(construct-normal-package-from-description
	       (make-package-description '(swank) '(()) 
					 (vector) (vector) (vector) false))
	     (->environment '(package)))
	    (load ,(expand-file-name 
		    "/home/anton/local/share/emacs/slime/contrib/swank-mit-scheme.scm" ; <-- insert your path
		    slime-path)
		  (->environment '(swank)))
	    (eval '(start-swank ,file) (->environment '(swank))))))

(defun mit-scheme ()
  (interactive)
  (slime 'mit-scheme))

(defun find-mit-scheme-package ()
  (save-excursion
    (let ((case-fold-search t))
      (and (re-search-backward "^[;]+ package: \\((.+)\\).*$" nil t)
	   (match-string-no-properties 1)))))

(setq slime-find-buffer-package-function 'find-mit-scheme-package)

(add-to-list 'load-path "~/local/share/clojure-mode"); <-- insert your path
(require 'clojure-auto) 
(setq swank-clojure-binary "/home/anton/bin/clojure") ; <-- insert your path
(add-to-list 'load-path "~/local/share/swank-clojure") ; <-- insert your path
(require 'swank-clojure-autoload) 

Profile

anton_nazarov: (Default)
anton_nazarov

September 2014

S M T W T F S
 123456
78910111213
14 151617181920
21222324252627
282930    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 21st, 2025 04:48 pm
Powered by Dreamwidth Studios