Это означает, Лисп пытается вычислить a и претерпевает неудачу.




Введение

https://www.lispworks.com/downloads/index.html (скачать LispWork)

Common Lisp – современный потомок языка программирования Lisp, придуманного Джоном Маккарти (John McCarthy) в 1956 году. Lisp был создан для "обработки символьных данных"7) и получил своё имя от одной вещи, в которой он был очень хорош: обработки списков (LISt Processing).

Маккарти был (и является до сих пор) исследователем в области искусственного интеллекта, и многие особенности, которые он заложил в первую версию, сделали этот язык замечательным инструментом для программирования искусственного интеллекта. Во время бума ИИ в 80-е Lisp оставался излюбленным языком для решения сложных проблем, как то: автоматическое доказательство теорем, планирование и составление расписаний, компьютерное зрение. Это были проблемы, требующие сложных программ, для написания которых нужен был мощный язык, так что программисты ИИ сделали Lisp таковым.

Хотя Common Lisp вытеснил большинство диалектов, от которых он был порождён, это не единственный сохранившийся диалект, и, в зависимости от того, где и когда вы встретились с Lisp, вы могли хорошо изучить один из этих, отличных от Common Lisp, диалектов.

Некоторые идеи, впервые реализованные в Lisp: конструкция if-then-else, рекурсивный вызов функций, динамическое распределение памяти, сборка мусора, представление функций как полноценных объектов, лексические замыкания, интерактивное программирование, инкрементальная компиляция и динамическая типизация.

Практика

Упражнение 0. Установите LispWork.

При запуске Lisp, вы должны увидеть приглашение, которое может выглядеть примерно так:

CL-USER>

Это приглашение Lisp (как и приглашение оболочки DOS или UNIX) — место, куда вы можете печатать выражения, которые заставляют компьютер делать что-либо. Потом он (Lisp) повторяет свои действия со следующим введенным вами выражением. Вот вам бесконечный цикл: считывания, вычисления, и печати (вывода на экран), поэтому он называется цикл-чтение-вычисление-печать (по-английски read-eval-print-loop), или сокращённо REPL. Этот процесс может также называться top-level, top-level listener, или Lisp listener.

Для знакомства с REPL, вам необходимо выражение Lisp, которое может быть прочитано, вычислено и выведено на экран. Простейшее выражение Lisp - это число.

Упражнение 1 Наберите 10 в приглашении Lisp и нажмете Enter, вы сможете увидеть что-то наподобие:

CL-USER> 10
10

Считыватель Lisp, R в REPL, считывает текст "10" и создаёт объект Lisp, представляющий число 10. Этот объект - самовычисляемый объект, это означает, что такой объект при передаче в вычислитель, E в REPL, вычисляется сам в себя. Это значение подаётся на устройство вывода REPL, которое напечатает объект "10" в отдельной строке.

Упражнение 2 Наберите (+ 2 3) в приглашении Lisp.

CL-USER> (+ 2 3)

Обратите внимание, что в любой функции Lisp первоначально указывается функция (+), которая будет выполнена, а потом аргументы, над которыми будет выполнена данная функция. Это выглядит следующим образом:

(Функция Аргумент1 Аргумент2... Аргументn)

Упражнение 3 Проведите 2-3 эксперимента в приглашении Lisp с различными арифметическими выражениями. Попробуйте выполнить сложные действия с вложенными скобками, типа:

CL-USER> (+ 2 (* 3 7)), CL-USER> (+ 4 (log (+ (cos x) (*x 5)))).

Упражнение 4 Проведите 2-3 эксперимента в приглашении Lisp с различными логическими выражениями вида:

CL-USER> (> 2 5)

Обратите внимание, что в Lisp T – это true, а NIL – это false.

Так как Lisp – функциональный язык, попробуем написать первую функцию. Для создания функций используется ключевое слово defun, затем следует наименование функции. После в первых скобках перечисляются аргументы функции, а во вторых скобках – тело функции.

Упражнение 5 Создайте функцию, которая будет печатать на экране «Здравствуй, мир»:

 

CL-USER> (defun hello-world ()

(format t "Здравствуй, мир"))

Первый аргумент для формата вывода format - t, nil или stream.

· t обозначает вывод на терминал.

· nil означает «не выводить никуда», но возвратить строку, содержащую результат.

· streams указание конкретного места вывода: файл, терминал или даже другая программа.

 

Теперь нажмите ENTER, чтобы Lisp listener прочитал ее.

Упражнение 6 Запустите вызов данной функции при помощи команды:

CL-USER> (HELLO-WORLD)

Упражнение 7 Напишите функцию, которая вычисляет квадрат из числа N. Помните про порядок функции и ее аргументов из упражнения 2, когда будете писать тело функции.

Упражнение 8 Наберите a в приглашении Lisp и нажмете Enter, вы сможете увидеть что-то наподобие:

CL-USER> a

Error: The variable A is unbound.

1 (continue) Try evaluating A again.

2 Return the value of:A instead.

3 Specify a value to use this time instead of evaluating A.

4 Specify a value to set A to.

5 (abort) Return to level 5.

6 Return to debug level 5.

7 Return to level 4.

8 Return to debug level 4.

9 Return to level 3.

10 Return to debug level 3.

11 Return to level 2.

12 Return to debug level 2.

13 Return to level 1.

14 Return to debug level 1.

15 Evaluate (+ 4 7) and ignore the rest.

16 Return to level 0.

17 Return to top loop level 0.

 

Type:b for backtrace or:c <option number> to proceed.

Type:bug-form "<subject>" for a bug report template or:? for other options.

CL-USER 23: 6 >

Это означает, Лисп пытается вычислить a и претерпевает неудачу.


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

Проще всего работу данной функции продемонстрировать простым примером:

(+ 5 10) -> 15; происходит вычисления выражения 5+10 и вывод результата

 

Упражнение 9 Теперь наберите выражение (+ 5 10) с ключевым словом QUOTE в приглашении Lisp и нажмете Enter, вы сможете увидеть что-то наподобие:

CL-USER 23: 6 > (quote (+ 5 10))

(+ 5 10)

Вычисление блокируется.


Функцию QUOTE можно записать и короче:
‘(+ 5 10) – равноценно quote

Упражнение 10 Используя quote или ‘ попробуйте еще раз выполнить упражнение 8.

Функция EVAL

· Функция EVAL обеспечивает дополнительный вызов интерпретатора Лиспа.

· При этом вызов может производиться внутри вычисляемого S-выражения.

· Функция EVAL позволяет снять блокировку QUOTE.

CL-USER> (quote (+ 1 2))
(+ 1 2)

CL-USER> (eval (quote (+ 1 2)))
3

Упражнение 11 Используя quote(‘) и EVAL заблокировать, а потом выполнить выражение из 2-х арифметических операций.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-12-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: