Реальный состав системы и внешний мир
Реальный состав системы и возможности ее компонентов можно исследовать с помощью специальных функций, предоставляющих информацию о включенных в систему объектах и их свойствах.
Состав системы:
(apropos ‘nm ‘package) — печатает информацию обо всех символах, имена которых содержат подстроку “nm”. Второй аргумент, если он указан, ограничивает эту информации заданным пакетом.
(describe ‘fn ) — дает описание места объекта в системе.
(symbol-plist ‘fn) — выдает перечень всех свойств объекта.
(documentation ‘fn ‘function) — выдает документацию по объекту.
Отладка программ:
(dribble ‘path) — направляет в файл протокол работы с Лисп-интерпретатором.
(step expr) — обеспечивает пошаговый режим интерпретации выражения с выдачей результатов каждого шага.
Ввод-вывод данных:
(setq inpt (open file-in :direction :input )) — заведение переменной для обозначения открытого потока.
(read inpt) — чтение из файла, открытого как поток.
(print (print eval-val prtcl) outpt) — запись данного eval-val в два разных файла.
(open file-in :direction :input ) — открытие файла на чтение.
Далее следуют три варианта открытия файлов на запись:
(open "output" :direction :output :if-exists :rename :if-does-not-exist :create) (open "protocol" :direction :output :if-exists :overwrite :if-does-not-exist :create) (open "history" :direction :output :if-exists :append :if-does-not-exist :create ) (close prtcl) — закрытие потока.
Особенности работы с файлами, основные приемы их открытия, задания специфики их функционирования и обмена данными с обычными символьными объектами иллюстрирует пример организации учебного цикла работы с Clisp, использующего пошаговую интерпретацию программ.
(defun eval-protocol () (prog (eval-val) ; выражения хранятся в файле "input.lsp"
metka (print '> prtcl) (setq eval-val (eval (list 'STEP ; пошаговое вычисление выражения (print (print ( if (eq 'eof (setq rinpt (read inpt NIL 'eof) )) (return(close inpt)) rinpt) prtcl) hstry) )))
; прочитанное записывается в файлы "protocol" и ; "history" (print '- prtcl) ;(print eval-val) (print (print eval-val prtcl) outpt) ; результат интерпретации в файлах ; "protocol" и "output" (go metka) ))
(defun help ( function-name ) (ed (string function-name )) )
(defun step1 (file-in) (prog ()
(setq inpt (open file-in :direction :input )) (setq outpt (open "output" :direction :output :if-exists :rename :if-does-not-exist :create)) (setq prtcl (open "protocol" :direction :output :if-exists :overwrite :if-does-not-exist :create)) (setq hstry (open "history" :direction :output :if-exists :append :if-does-not-exist :create )) (print '"****** new-session ******" hstry)
; цикл прервется по достижении конца файла ввода (eval-protocol)
(close prtcl) (close hstry) (close outpt) ))
(step1 "input.lsp") ; интерпретируемые выражения хранятся в файле ; "input.lsp"