Основы функционального программирования


Реальный состав системы и внешний мир


Реальный состав системы и возможности ее компонентов можно исследовать с помощью специальных функций, предоставляющих информацию о включенных в систему объектах и их свойствах.

Состав системы:

(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"


Содержание раздела