Опубликован: 21.08.2007 | Уровень: для всех | Доступ: платный
Лекция 8:

Стандартное (системное) программирование

< Лекция 7 || Лекция 8: 12 || Лекция 9 >

GO-форма, используемая для указания перехода (GO A) указывает, что программа продолжается оператором, помеченным атомом A, причем это A может быть и из более внешнего prog.

RETURN - нормальный конец программы. Аргумент return вычисляется, что и является значением программы. Никакие последующие операторы не вычисляются.

function rev (x: list) :List
       var y, z: list;
begin
 A: if null (x) Then rev := y;
      Z := cdr (x);
    if atom (z) then goto B;
      z := rev (z);
 B:   y := cons (z, y);
      x := cdr (x);
                    goto A
end;
Пример 8.1. Функция REV, обращающая список и все подсписки, столь же естественно пишется с помощью рекурсивного Prog-выражения.

Функция rev обращает все уровни списка, так что rev от (A ((B C) D)) даст ((D (C B))A).

(DEFUN rev (x) (prog (y z)
       
A  (COND ((null x)(return y)))
       (setq z (CDR x))
    (COND ((ATOM z)(goto B)))
       (setq z (rev z)) 

B  (setq y (CONS z y))
    (setq x (CDR x))
    (goto A)
))

Атомы, играющие роль меток, работают как указатели помеченного блока.

В принципе, SET и SETQ могут быть реализованы примерно так же, как и поиск значения переменной, только с копированием связей, расположенных ранее изменяемой переменной.

(DEFUN set (x y) (assign  x  y  Alist))

Здесь ASSIGN - модель присваивания переменным, хранящим значения в ассоциативном списке Alist ( "Определение языков программирования" ). Работает как замена связанного с данной переменной значения на новое заданное значение. Если пары не было вообще, то новая пара из переменной и ее значения помещается в конце списка Alist, чтобы она могла работать как глобальная.

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

(setq x 'y)
  (set x 'NEW)
  (print x)
  (print y)
; Напечатается Y и NEW.
Пример 8.2.

Для стандартного программирования характерно четкое разделение понятий "программа" и "данное" и учет в процессе обработки данных средств контроля типов данных. Кроме того идеи структурного программирования налагают на стиль программирования ряд ограничений, способствующих удобству отладки программ:

  • Дисциплина логики управления с исключением переходов по меткам.
  • Минимизация использования глобальных переменных в пользу параметров процедур.
  • Полнота условий в ветвлениях, отказ от отсутствия "else".
  • Однотипность результатов, полученных при прохождении через разные ветви.

Общий механизма интерпретации стандартной программы естественно представить как автомат с отдельными таблицами имен для переменных, значения которых подвержены изменениям, и для меток и процедур, определения которых неизменны. Наиболее распространенные языки программирования, такие как Фортран, Паскаль, Си, Бейсик, придерживаются примерно такой семантики при слегка варьируемой строгости контроля типов данных [ [ 83 ] , [ 85 ] , [ 28 ] , [ 29 ] , [ 17 ] , [ 47 ] ]. Семантика стандартных императивных языков допускает применение общей абстрактной машины, что объясняет существование многоязыковых систем программирования, поддерживающих общие библиотеки процедур, компонентов и модулей, а также интеграцию с ассемблером [ [ 42 ] , [ 86 ] , [ 22 ] ].

< Лекция 7 || Лекция 8: 12 || Лекция 9 >
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Илья Ардов
Илья Ардов

Добрый день!

Я записан на программу. Куда высылать договор и диплом?

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989