Лекция 4. Возможности языков Лисп и Хаскелл
Цель лекций. Ознакомление основными принципами работы на Лиспе и Хаскелле. Типы данных. Возможности этих языков.
Содержание лекций. Лисп ориентирован на обработку нечисловых задач. Он основан на алгебре списочных структур, лямбда-исчислении и теории рекурсий [9,10]. Язык имеет функциональную направленность, т. е. любое предложение заключенное в скобки, введенное вне редактора считается функцией и выполняется сразу после нажатия «ENTER». Чтобы предотвратить вычисление значения выражения, нужно перед этим выражением поставить апостроф «’». Основные типы данных языка - атомы и списки. Атомы - это символы и числа. Определения функций могут храниться в файлах и загружаться используя функцию LOAD: (load <имя файла>) Эта функция загружает файл выражений и выполняет эти выражения. <Имя файла> - это строковая константа, которая представляет собой имя файла без расширения (подразумевается расширение ".lsp"). Запуск системы XLisp осуществляется командой: Xlisp-PLUS После нескольких секунд загрузки на экране дисплея появится сообщение: XLISP-PLUS Version 2.1h Portions Copyright (C ) 1988, by David Betz. Modified by Thomas Almy and others. После чего появится знак >, означающий приглашение системы к работе. Системный редактор начинает работать и выдает на экран свое меню: File, Edit и Run. На языке Лисп имеются следующие функций: Функции разбора CAR возвращает в качестве значения первый элемент списка. (CAR список) S - выражение (атом либо список). Функция создания CONS. Функция CONS строит новый список из переданных ей в качестве аргументов головы и хвоста. (CONS голова хвост) Для того чтобы можно было включить первый элемент функции CONS в качестве первого элемента значения второго аргумента этой функции, второй аргумент должен быть списком. Значением функции CONS всегда будет список. Функции присваивания: SET, SETQ, SETF. Функция SET - присваивает символу или связывает с ним некоторое значение. Причем она вычисляет оба своих аргумента. Установленная связь действительна до конца работы, если этому имени не будет присвоено новое значение функцией SET. Функция LIST - создает список из элементов. Она возвращает в качестве своего значения список из значений аргументов. Количество аргументов произвольно. На языке Лисп имеются следующие предикаты: Предикаты ATOM, EQ, EQL, EQUAL. Предикат - функция, которая определяет, обладает ли аргумент определенным свойством, и возвращает в качестве значения NIL или T. Предикат ATOM - проверяет, является ли аргумент атомом: (ATOM s - выражение). Значением вызова ATOM будет T, если аргументом является атом, и NIL - в противном случае. Также имеются вложенные вызовы CAR и CDR. Комбинации вызовов CAR и CDR образуют уходящие в глубину списка обращения, в Лиспе для этого используется более короткая запись. Желаемую комбинацию вызовов CAR и CDR можно записать в виде одного вызова функции: (C...R список ). Вместо многоточия записывается нужная комбинация из букв A и D (для CAR и CDR соответственно). В один вызов можно объединять не более четырех функций CAR и CDR. Список. Список - упорядоченная последовательность, элементами которой являются атомы либо списки. Списки заключаются в круглые скобки, элементы списка разделяются пробелами. Несколько пробелов между символами эквивалентны одному пробелу. Первый элемент списка называется «головой», а остаток, список без первого элемента, называется «хвостом. Список в котором нет ни одного элемента, называется пустым и обозначается «()» либо NIL. Символ - это имя, состоящее из букв, цифр и специальных знаков, которое обозначает какой-нибудь предмет, объект, действие [10]. Язык Haskell строго типизированный язык, что значит только то, что значит. Невозможно неосторожно привести Double к Int или вызвать метод по пустому указателю. Это ведёт к меньшему количеству ошибок. В других языках там, где это приведение выполняется неявно, проблемы часто возникают когда компилятор обращается с Double как с Int или с Int как с указателем. В отличие от других языков, типы в языке Haskell определяются автоматически. Это означает, что вам очень редко придется объявлять типы ваших функций, кроме тех случаев, которые оговорены документацией кода. Язык Haskell посмотрит на то, как вы используете переменные, и сделает вывод о том, какой должен быть тип у переменных, после этого будет проведена проверка типов для того, чтобы убедиться, что нет несовпадения типов. Так что вы получаете преимущества строгой типизации. Ошибки отлавливаются во время компиляции чаще, чем во время выполнения, без преград, сопутствующих другим языкам. Кроме того, язык Haskell будет делать вывод для большинства общепринятых типов переменных. Так что если вы пишете, например, функцию сортировки без описания типа, язык Haskell удостоверится, что она будет работать для всех значений, которые могут быть отсортированы. Программы на языке Haskell содержат меньше ошибок, потому что язык Haskell: Чистый. Нет побочных эффектов; Строго типизированный. Не может быть неоднозначного использования типов; Лаконичный. Программы короче, что позволяет просто взглянуть на функцию и «уяснить всё сразу», чтобы убедиться в том, что функция правильная; Высокоуровневый. Программы на языке Haskell чаще всего читаются так, как описание алгоритма. Это позволяет проще проводить проверку того, что функция делает то, что утверждает алгоритм. Так как кодирование происходит на более высоком уровне абстракции, оставляя детали компилятору, то существует меньше мест, куда может закрасться ошибка; Управляет памятью. Не надо заботиться о «повисших» ссылках, сборщик мусора позаботится о них. Программист может беспокоиться о выполнении алгоритма, а не о подсчёте памяти; Модульный. Язык предоставляет более сильный механизм составления вашей программы из уже разработанных модулей. Таким образом, программы могут быть более модульными. Кроме того, большинство людей сходятся во взглядах, что вы просто думаете по-другому, решая проблему на функциональном языке. Вы подразделяете задачу на всё меньшие и меньшие задачи, а после этого вы пишете эти маленькие задачи, которые объединяются разными способами для достижения конечного результата. Там просто нет места для ошибок!
Достарыңызбен бөлісу: |