П.Лэндин (P.J.Landin) предложил специальную
(
Можно сказать, что первые
SUBR или FSUBR, отражает разницу в методах обработки параметров обычными и специальными функциями.
При ассемблировании атомарных форм SUBR, FSUBR.
Формы вида ( QUOTE a ) рассматриваются как литеральная величина, содержащая a. Ее адрес - результат ассемблирования. Величина защищена от выметания. Новый литерал не создается, если он совпадает с ранее построенным.
Определение операций ассемблера выполнялось OPDEFINE, SYM в списке свойств атома, который предстоит определить как обозначение или
(OPDEFINE ( (CLA 500Q8)
(TRA 2Q9)
(LOAD 1000)
(OVBGN 7432Q) ))
Примеры применения ассемблера
Предикат GREATER наводит некоторый канонический порядок среди атомов.
(LAP ( (GREATER SUBR 2)
(TLQ (* 3))
(PXA 0 0)
(TRA 1 4)
(CLA (QUOTE *T* ) )
(TRA 1 4) )
NIL)
TSX 6204Q должна быть вставлена после позиции 6217Q. Последняя содержит и эти
(LAP (6217Q (TRA NIL) )NIL)
(LAP (NIL (CLA A)
(TSX 6204Q)
(TRA B) )
( (A . 6243Q) (B . 6220Q) )
)
Встраиваемые в
При сравнении императивного и
Машина
s e c d => s' e' c' d' — переход от старого состояния к новому.
Для характеристики встроенных
LD — ввод данного из контекста в
LDC — ввод константы из программы в
LDF — ввод определения функции в
AP — применение функции, определение которой уже в
RTN — возврат из определения функции к вызвавшей ее программе;
SEL — ветвление в зависимости от активного (верхнего) значения
JOIN — переход к общей точке после ветвления;
CAR — первый элемент из активного значения
— без первого элемента активное значение
— формирование узла по двум верхним значениям
ATOM — неделимость (атомарность) верхнего элемента
EQ — равенство двух верхних значений
SUB1 — вычитание 1 из верхнего элемента
ADD1 — прибавление 1 к верхнему элементу
STOP — останов.
s e (STOP ) d >> s e (STOP ) d
Следуя Хендерсону, для четкого отделения обрабатываемых элементов от остальной части списка будем использовать следующие обозначения: (x . l ) — это значит, что первый элемент списка — x, а остальные находятся в списке l.
(x y . l ) — первый элемент списка — x, второй элемент списка — y, остальные находятся в списке l и т.д. Теперь мы можем методично описать эффекты всех перечисленных выше
s e(LDC q . c)d >> (q . s) e c d
(a . s)e(ADD1 . c)d >> (a+1 . s) e c d
(a . s)e(SUB1 . c)d >> (a-1 . s) e c d
(a b . s)e(CONS . c)d >> ((a . b) . s) e c d
((a . b) . s)e(CAR . c) >> (a . s) e c d
((a . b) . s)e(CDR . c) >> (b . s) e c d
(a . s)e(ATOM . c)d >> (t . s) e c d
(a b . s)e(EQ . c)d >> (t . s) e c d
где t — логическое значение.
Для доступа к значениям, расположенным в контексте, можно определить специальную функцию N-th, выделяющую из списка элемент с заданным номером N в предположении, что длина списка превосходит заданный адрес.
(DEFUN N-th (n list )
(COND
((EQ n 0 )(CAR list ))
(T (N-th (SUB1 n ) (CDR list ) )) ))
Продолжаем описание
s e (LD n . c) d >> (x . s) e c d
где x — это значение ( N-th n e )
При реализации ветвлений
( ... SEL ( ... JOIN ) ( ... JOIN ) ... )
Ветви размещены в подсписках с завершителем JOIN, после которых следует общая часть вычислений.
(t . s) e (SEL c1 c0 . c) d >> s e ct (c . d)
s e (JOIN ) (c . d) >> s e c d
где ct — это c1 или c0 в зависимости от t.
Организация вызова процедур требует защиты контекста от локальных изменений, происходящих при интерпретации тела определения. Для этого при вводе определения функции в RTN, восстанавливающей
s e (LDF f . c) d >> ((f . e) . s) e c d
((f . ef) vf . s) e (AP . c) d
>> NIL (vf . ef) f (s e c . d)
(x) e (RTN ) (s e c . d) >> (x . s) e c d
где f — тело определения, ef — контекст в момент вызова функции, vf — фактические параметры для вызова функции, x — результат функции.
Упражнение 7.1. Программа имеет вид:
(LD 3 ADD1 LDC 128 EQ STOP)
Напишите последовательность состояний
Ответ: Данная программа проверяет, меньше ли на 1 значение, хранящееся в контексте по адресу 3, чем заданная в программе константа 128. При ее работе
NIL (3 ) (4 ) (128 4 ) (NIL )
Упражнение 7.2. Напишите управляющие программы, дающие результаты, эквивалентные следующим выражениям:
(CADR e )
(EQ (CAR e) 'QUOTE )
(COND ((EQ n 0 )(CAR l ))
(T (CONS (SUB1 n ) (CDR l ))) )
(Адреса значений e, n, l можно обозначить как @e, @n, @l, соответственно.)
Ответ:
( LD @e CDR CAR )
( LD @e CAR LDC QUOTE EQ )
( LD @n LDc 0 EQ SEL (LD @l CAR JOIN)
(LD @n SUB1 LD @l CDR CONS JOIN) )
Упражнение 7.3. Напишите спецификацию SET, сохраняющей активное значение
Ответ: Нужна функция, заменяющая в списке указанный старый элемент новым.
(DEFUN ASS (e n l )
(COND
((EQ n 0 )(CONS e (CDR l )) )
(T (CONS (CAR l )
(ASS e (SUB1 n ) (CDR l ) )
) ) ) )
Тогда можно описать SET следующим образом:
(x . s) e (SET n . c) d >> s xne c d
где xne = (ASS x n e) — новое состояние контекста.
На этом можно было бы завершить описание реализационного минимума языка
Здесь же определим общий цикл выполнения программ на
(DEFUN put (at ind def) (setf (get at ind) def))
(put 'a 'SYM '(LAMBDA () (setq st (CONS (caar st)
(CDR st)))
))
(put 'd 'SYM '(LAMBDA () (setq st (CONS (cadar st)
(CDR st)))
))
(put 'at 'SYM '(LAMBDA () (setq st (CONS
(ATOM (CAR st))
(CDR st)))
))
(put 'co 'SYM'(LAMBDA () (setq st (CONS
(CONS (CAR st) (cadr st))
(cddr st)))
))
(put 'equ 'SYM '(LAMBDA () (setq st (CONS
(EQ (CAR st) (cadr st))
(cddr st)))
))
(put 'sum 'SYM '(LAMBDA () (setq st (CONS
(+ (CAR st) (cadr st))
(cddr st)))
))
(put 'def 'SYM '(LAMBDA () (setq st (CONS
(- (CAR st) (cadr st))
(cddr st)))
))
(put 'mlt 'SYM '(LAMBDA () (setq st (CONS
(* (CAR st) (cadr st))
(cddr st)))
))
(put 'ldc 'SYM '(LAMBDA ()
; CP — продолжение программы вслед за LDC
(setq st (CONS (CAR cp)
st))
(setq cp (CDR cp))
; CP — без константы, переданной в стек
))
; Определение интерпретатора машины
(DEFUN secd (LAMBDA ()(cond ((null cp)
(print "?end-of-program!"))
((EQ (CAR cp) 'STOP)
(print "!normal-finish!"))
((get (CAR cp)'SYM)
(command (CAR cp) (CDR cp))
(secd))
(T (print "?error-command!")
(setq cp (CDR cp))
(secd))
)))
(DEFUN command (LAMBDA (acp dcp) (setq cp dcp)
(print acp)
(apply (get acp 'SYM)'())
(prsecd)
(read)
))
; Вывод на экран состояния машины
(DEFUN prsecd (LAMBDA()(prst)(prcp)))
(DEFUN prst (LAMBDA ()(print (list "stack:=" st
))))
(DEFUN prcp (LAMBDA ()(print (list "control:=" cp
))))
; Задание состояния машины :
; ST — стек
; CP — управляющая программа
; ENV — контекст
; DM — память для восстановления состояния
(setq st '())
(setq cp '(ldc 1 ldc 2 ldc 3 mlt def ldc 4 equ
stop ))
(secd)
(prsecd)
(read)
(system)
(setq st '(a ((1 2) (4 5)) 3 6 7 8 9 11 13 12 14
21 25 9 1 0))
(setq cp '(at de co at equ stop sum def mlt stop))
(prsecd)
(secd)
(prsecd)
(setq st (cddr st))
(setq cp (CDR cp))
(prsecd)
(secd)
(prsecd)
(system)
(apply (get 'a 'SYM)'())
(prst)
(setq st (CDR st))
(apply (get 'd 'SYM)'())
(prst)
(setq st (CDR st))
(apply (get 'at 'SYM)'())
(prst)
(setq st (CDR st))
(apply (get 'co 'SYM)'())
(prst)
(apply (get 'at 'SYM)'())
(prst)
(setq st (CDR st))
(setq st (CDR st))
(apply (get 'equ 'SYM)'())
(prst)
(setq st (CDR st))
(apply (get 'sum 'SYM)'())
(prst)
(setq st (CDR st))
(apply (get 'def 'SYM)'())
(prst)
(setq st (CDR st))
(apply (get 'mlt 'SYM)'())
(prst)
(setq st '(12 12 12) )
(prst)
(setq st (CDR st))
(apply (get 'equ'SYM)'())
(prst)
(system)
П.Лэндин (P.J.Landin) предложил специальную
(
Можно сказать, что первые
SUBR или FSUBR, отражает разницу в методах обработки параметров обычными и специальными функциями.
При ассемблировании атомарных форм SUBR, FSUBR.
Формы вида ( QUOTE a ) рассматриваются как литеральная величина, содержащая a. Ее адрес - результат ассемблирования. Величина защищена от выметания. Новый литерал не создается, если он совпадает с ранее построенным.
Определение операций ассемблера выполнялось OPDEFINE, SYM в списке свойств атома, который предстоит определить как обозначение или
(OPDEFINE ( (CLA 500Q8)
(TRA 2Q9)
(LOAD 1000)
(OVBGN 7432Q) ))
Примеры применения ассемблера
Предикат GREATER наводит некоторый канонический порядок среди атомов.
(LAP ( (GREATER SUBR 2)
(TLQ (* 3))
(PXA 0 0)
(TRA 1 4)
(CLA (QUOTE *T* ) )
(TRA 1 4) )
NIL)
TSX 6204Q должна быть вставлена после позиции 6217Q. Последняя содержит и эти
(LAP (6217Q (TRA NIL) )NIL)
(LAP (NIL (CLA A)
(TSX 6204Q)
(TRA B) )
( (A . 6243Q) (B . 6220Q) )
)
Встраиваемые в
При сравнении императивного и
Машина
s e c d => s' e' c' d' — переход от старого состояния к новому.
Для характеристики встроенных
LD — ввод данного из контекста в
LDC — ввод константы из программы в
LDF — ввод определения функции в
AP — применение функции, определение которой уже в
RTN — возврат из определения функции к вызвавшей ее программе;
SEL — ветвление в зависимости от активного (верхнего) значения
JOIN — переход к общей точке после ветвления;
CAR — первый элемент из активного значения
— без первого элемента активное значение
— формирование узла по двум верхним значениям
ATOM — неделимость (атомарность) верхнего элемента
EQ — равенство двух верхних значений
SUB1 — вычитание 1 из верхнего элемента
ADD1 — прибавление 1 к верхнему элементу
STOP — останов.
s e (STOP ) d >> s e (STOP ) d
Следуя Хендерсону, для четкого отделения обрабатываемых элементов от остальной части списка будем использовать следующие обозначения: (x . l ) — это значит, что первый элемент списка — x, а остальные находятся в списке l.
(x y . l ) — первый элемент списка — x, второй элемент списка — y, остальные находятся в списке l и т.д. Теперь мы можем методично описать эффекты всех перечисленных выше
s e(LDC q . c)d >> (q . s) e c d
(a . s)e(ADD1 . c)d >> (a+1 . s) e c d
(a . s)e(SUB1 . c)d >> (a-1 . s) e c d
(a b . s)e(CONS . c)d >> ((a . b) . s) e c d
((a . b) . s)e(CAR . c) >> (a . s) e c d
((a . b) . s)e(CDR . c) >> (b . s) e c d
(a . s)e(ATOM . c)d >> (t . s) e c d
(a b . s)e(EQ . c)d >> (t . s) e c d
где t — логическое значение.
Для доступа к значениям, расположенным в контексте, можно определить специальную функцию N-th, выделяющую из списка элемент с заданным номером N в предположении, что длина списка превосходит заданный адрес.
(DEFUN N-th (n list )
(COND
((EQ n 0 )(CAR list ))
(T (N-th (SUB1 n ) (CDR list ) )) ))
Продолжаем описание
s e (LD n . c) d >> (x . s) e c d
где x — это значение ( N-th n e )
При реализации ветвлений
( ... SEL ( ... JOIN ) ( ... JOIN ) ... )
Ветви размещены в подсписках с завершителем JOIN, после которых следует общая часть вычислений.
(t . s) e (SEL c1 c0 . c) d >> s e ct (c . d)
s e (JOIN ) (c . d) >> s e c d
где ct — это c1 или c0 в зависимости от t.
Организация вызова процедур требует защиты контекста от локальных изменений, происходящих при интерпретации тела определения. Для этого при вводе определения функции в RTN, восстанавливающей
s e (LDF f . c) d >> ((f . e) . s) e c d
((f . ef) vf . s) e (AP . c) d
>> NIL (vf . ef) f (s e c . d)
(x) e (RTN ) (s e c . d) >> (x . s) e c d
где f — тело определения, ef — контекст в момент вызова функции, vf — фактические параметры для вызова функции, x — результат функции.
Упражнение 7.1. Программа имеет вид:
(LD 3 ADD1 LDC 128 EQ STOP)
Напишите последовательность состояний
Ответ: Данная программа проверяет, меньше ли на 1 значение, хранящееся в контексте по адресу 3, чем заданная в программе константа 128. При ее работе
NIL (3 ) (4 ) (128 4 ) (NIL )
Упражнение 7.2. Напишите управляющие программы, дающие результаты, эквивалентные следующим выражениям:
(CADR e )
(EQ (CAR e) 'QUOTE )
(COND ((EQ n 0 )(CAR l ))
(T (CONS (SUB1 n ) (CDR l ))) )
(Адреса значений e, n, l можно обозначить как @e, @n, @l, соответственно.)
Ответ:
( LD @e CDR CAR )
( LD @e CAR LDC QUOTE EQ )
( LD @n LDc 0 EQ SEL (LD @l CAR JOIN)
(LD @n SUB1 LD @l CDR CONS JOIN) )
Упражнение 7.3. Напишите спецификацию SET, сохраняющей активное значение
Ответ: Нужна функция, заменяющая в списке указанный старый элемент новым.
(DEFUN ASS (e n l )
(COND
((EQ n 0 )(CONS e (CDR l )) )
(T (CONS (CAR l )
(ASS e (SUB1 n ) (CDR l ) )
) ) ) )
Тогда можно описать SET следующим образом:
(x . s) e (SET n . c) d >> s xne c d
где xne = (ASS x n e) — новое состояние контекста.
На этом можно было бы завершить описание реализационного минимума языка
Здесь же определим общий цикл выполнения программ на
(DEFUN put (at ind def) (setf (get at ind) def))
(put 'a 'SYM '(LAMBDA () (setq st (CONS (caar st)
(CDR st)))
))
(put 'd 'SYM '(LAMBDA () (setq st (CONS (cadar st)
(CDR st)))
))
(put 'at 'SYM '(LAMBDA () (setq st (CONS
(ATOM (CAR st))
(CDR st)))
))
(put 'co 'SYM'(LAMBDA () (setq st (CONS
(CONS (CAR st) (cadr st))
(cddr st)))
))
(put 'equ 'SYM '(LAMBDA () (setq st (CONS
(EQ (CAR st) (cadr st))
(cddr st)))
))
(put 'sum 'SYM '(LAMBDA () (setq st (CONS
(+ (CAR st) (cadr st))
(cddr st)))
))
(put 'def 'SYM '(LAMBDA () (setq st (CONS
(- (CAR st) (cadr st))
(cddr st)))
))
(put 'mlt 'SYM '(LAMBDA () (setq st (CONS
(* (CAR st) (cadr st))
(cddr st)))
))
(put 'ldc 'SYM '(LAMBDA ()
; CP — продолжение программы вслед за LDC
(setq st (CONS (CAR cp)
st))
(setq cp (CDR cp))
; CP — без константы, переданной в стек
))
; Определение интерпретатора машины
(DEFUN secd (LAMBDA ()(cond ((null cp)
(print "?end-of-program!"))
((EQ (CAR cp) 'STOP)
(print "!normal-finish!"))
((get (CAR cp)'SYM)
(command (CAR cp) (CDR cp))
(secd))
(T (print "?error-command!")
(setq cp (CDR cp))
(secd))
)))
(DEFUN command (LAMBDA (acp dcp) (setq cp dcp)
(print acp)
(apply (get acp 'SYM)'())
(prsecd)
(read)
))
; Вывод на экран состояния машины
(DEFUN prsecd (LAMBDA()(prst)(prcp)))
(DEFUN prst (LAMBDA ()(print (list "stack:=" st
))))
(DEFUN prcp (LAMBDA ()(print (list "control:=" cp
))))
; Задание состояния машины :
; ST — стек
; CP — управляющая программа
; ENV — контекст
; DM — память для восстановления состояния
(setq st '())
(setq cp '(ldc 1 ldc 2 ldc 3 mlt def ldc 4 equ
stop ))
(secd)
(prsecd)
(read)
(system)
(setq st '(a ((1 2) (4 5)) 3 6 7 8 9 11 13 12 14
21 25 9 1 0))
(setq cp '(at de co at equ stop sum def mlt stop))
(prsecd)
(secd)
(prsecd)
(setq st (cddr st))
(setq cp (CDR cp))
(prsecd)
(secd)
(prsecd)
(system)
(apply (get 'a 'SYM)'())
(prst)
(setq st (CDR st))
(apply (get 'd 'SYM)'())
(prst)
(setq st (CDR st))
(apply (get 'at 'SYM)'())
(prst)
(setq st (CDR st))
(apply (get 'co 'SYM)'())
(prst)
(apply (get 'at 'SYM)'())
(prst)
(setq st (CDR st))
(setq st (CDR st))
(apply (get 'equ 'SYM)'())
(prst)
(setq st (CDR st))
(apply (get 'sum 'SYM)'())
(prst)
(setq st (CDR st))
(apply (get 'def 'SYM)'())
(prst)
(setq st (CDR st))
(apply (get 'mlt 'SYM)'())
(prst)
(setq st '(12 12 12) )
(prst)
(setq st (CDR st))
(apply (get 'equ'SYM)'())
(prst)
(system)
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.