Введение в Lisp

      Комментарии к записи Введение в Lisp отключены

Помечено: 

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 3 нед. назад.

  • Автор
    Сообщения
  • #3858

    dimazilla
    Участник

    Статья не моя, она безвозмездно предоставлена мне Евтушенко Дмитрием. За что я ему очень благодарен. Прошу строго не судить, вероятно, это «проба пера».

    Суть Lisp

    Lisp — не только один из древнейших языков программирования, а так же первый функциональны язык программирования.

    Язык лисп не существует. Существуют различные диалекты лиспа. Диалекты лиспа отличаются только структурой базовых функций (например вывод в Common Lisp (print что-то), а в Scheme (display что-то)). В дальнейшем мы будим писать на Common Lisp и Scheme.

    Списки — наше все

    Лисп работает на списках. Программа, написанная на лиспе, представляет из себя ряд списков. Списки представляются ввиде скобок, в которые через пробел вписаны элементы списка. Например, (1 2 3). Элементами списка могут быть как другие списки, так и атомы — числа, название переменных/функций и т.д.

    Рассмотрим, как интерпретатор лиспа анализирует следующий список:
    (+ 2 2)

    Шайтан машина берет первый элемент и проверяет, является ли он функцией. Остальные элементы являются аргументами функции. Таким образом, выражение вернет 4. Подобные выражения называются S-выражениями. Если какие-либо элементы списка являются S-выражениями, то они тоже будут вычислены. Например (+ 2 (* 2 2)) вернет 6.

    Передать аргумент в виде списка можно двумя способами: использовать функции quote или list. Первая просто вернет свой аргумент в чистом виде,
    вторая предварительно вычислит свои аргументы:

    (quote ((+ 1 2) (* 1 2))) -> ((+ 1 2) (* 1 2))
    (list (+ 1 2) (* 1 2)) -> (3 2)

    Крылья, перья. . . Главное — хвост

    Настало время познакомиться со структурой списка. Наберите в своем интерпритаторе (cons 1 2). Он вернет вам (1 . 2). Это cons-ячейка. Наберите (car (cons 1 2)) и (cdr (cons 1 2)). Эти команды вернут 1 и 2 соответственно.

    Применим car и cdr к списку (1 2 3):
    (car (1 2 3)) -> 1
    (cdr (1 2 3)) -> (2 3)

    Вывод: список является связкой нескольких cons-ячеек. Первый элемент называется головой, оставшиеся — хвостом. Хвост всегда оканчивается пустым списком.

  • #3869

    Хорошее начало, но мне кажется, что новичок зайдет, увидит «какие-то» списки, испугается и убежит. Есть предложение добавить (подумаем куда вставить) примеры. Начать можно с «hello world» и какой-нибудь простой игры типа «угадай число». Как смотрите на это?

Для ответа в этой теме необходимо авторизоваться.