Новосибирский Государственный Университет
Опубликован: 05.02.2007 | Доступ: свободный | Студентов: 2222 / 413 | Оценка: 4.30 / 4.23 | Длительность: 10:15:00
Лекция 2:

Работа с Лисп-системой

< Лекция 1 || Лекция 2: 12 || Лекция 3 >
Аннотация: Вторая лекция адресована практикам, предпочитающим изучение языка программирования сопровождать немедленным экспериментом, умеющим находить информацию в сетях и устанавливать на компьютере системы программирования. Но и новичкам имеет смысл познакомиться с системой программирования на Лиспе сразу, не дожидаясь полной картины изучаемого языка. Рассмотрим следующее: Диалог с Лисп-системой Запуск Лисп-программ из файлов Пошаговое вычисление Сайты с Лисп-системами

Установка Лисп-системы

Система программирования на языке Лисп представляет собой комплекс функций для обработки различных структур данных, включая многоуровневые списки, числа, строки, файлы и их имена. Программа на Лиспе может дополнять их комплекс. Функции встраиваются в систему как атомы, имеющие определения на уровне исполняемого кода или языка программирования. В систему входит компилятор, обеспечивающий перевод функций с уровня языка программирования на уровень исполняемого кода, поэтому нет формальной разницы между определениями разного уровня. В целом работа Лисп-системы обеспечивается интерпретатором, вычисляющим отдельные выражения, последовательность которых и есть программа.

Диалог с Лисп-системой

Рассмотрим особенности функционирования Лисп-интерпретатора на примере системы GNU Clisp.

> clisp

Работа системы начинается с заставки вида:

> clisp

  i  i   i i i   i  i      ooooo      o              ooooooo    ooooo      ooooo
  I I   I I I   I  I     8        8     8                    8        8          o   8        8
  I  \  `+'   /   I     8               8                    8        8               8        8
   \   `-+-'    /       8               8                    8         ooooo      8oooo
    `-__|__-'        8               8                    8                   8    8
           |             8         o    8                    8         o        8    8
  ------+------       ooooo      8oooooo   ooo8ooo    ooooo     8
Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2002

[1]>

Символ " > " - приглашение к вводу выражений для интерпретации. Выход из Лисп-системы осуществляется как вызов функции " BYE "

[1]> (BYE)1Естественно, надо набрать и "Конец строки" -  "Enter".
	   

Происходит возврат к операционной системе.

[1]> (BYE)
Bye.

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

[1]> (CONS 1 2)

Интерпретатор вычисляет это выражение, затем печатается полученный результат и появляется очередное приглашение:

[1]> (CONS 1 2)
(1 . 2)
[2]>

При недостатке правых скобок ничего не происходит:

[1]> (CONS 1 2

Система ждет, пока не получит недостающие скобки, прежде чем предложить прочитанную форму интерпретатору:

[1]> (CONS 1 2
)
(1 . 2)
[2]>

Баланс скобок проще всего поддерживать, набирая пары "()" и вставляя потом между ними нужный текст. При наборе закрывающей скобки система на полсекунды перемещает курсор на соответствующую левую скобку, что также помогает замечать нарушения в балансе скобок.

При невозможности интерпретировать полученное данное как символьное выражение система печатает диагностическое сообщение:

[2]> (CONS A B)
*** - EVAL: variable A has no value2EVAL: переменная A не имеет значения (перевод с английского –можно выбрать версию с русской диагностикой   
1. Break [3]>

В этом примере перед атомами "A" и "B" следует поставить апострофы, показывающие системе, что здесь эти атомы не рассматриваются как переменные. Система перешла в режим обработки прерывания, выйти из которого можно с помощью Ctrl-D (одновременное нажатие).

[5]> (cons a 'b)                                                                

*** - EVAL: variable A has no value
1. Break [6]> 3Была набрана комбинация Ctrl-D            
[7]> (cons 'a 'b)                                                               
(A . B)
[8]>

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

[1]> (CONS 1 2)
(1 . 2) [2]>4При нажатии верхней стрелки появился текст "(CONS 1 2)"    (CONS 1 2)

Теперь эту строку можно подкорректировать:

[1]> (CONS 1 2)
(1 . 2)
[2]> (CONS 4 5)5Цифры 1 и 2  заменены на 4 и 5, затем после нажатия "Enter" получен результат.   
(4 . 5)

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

[1]> (cons 'ГОЛОВА   'хвост)
(ГОЛОВА . ХВОСТ)
[2]>

Запуск Лисп-программ из файлов

Программа на Лиспе – это последовательность интерпретируемых выражений.

Представим, что подготовлен файл с именем "start.lsp":

; пример программы
(defun первый (x) (car x))   ;; определение новой функции
(print (первый '(one two)))  ;; вывод результата применения новой функции

Расширение "lsp" символизирует тексты на Лиспе. В этом файле содержится программа с построчными комментариями. Комментарии отделяются от программы символом ";".

Defun – функция трех аргументов: первый – имя объявляемой новой функции, второй – список ее аргументов, третий – тело определения. Функция " Defun " встраивает в систему новую, определяемую в программе функцию.

Print – унарная псевдо-функция, печатающая свой аргумент.

Заранее подготовленный файл с программой можно ввести и сразу исполнить с помощью функции LOAD.

[1]> (LOAD 'start.lsp)
T
ONE
[2]>

Перед именем файла ставится апостроф. Результат " T " означает, что чтение файла прошло успешно. При чтении файла произошла интерпретация содержащихся в нем выражений. Чтобы увидеть результаты работы программы здесь применение функции оформлено как аргумент псевдо-функции " PRINT ".

На примерах видно, что символьное выражение может выглядеть как имя, число или круглоскобочная структура.

< Лекция 1 || Лекция 2: 12 || Лекция 3 >