Поскольку я не рассчитываю, что читатель ознакомился с предыдущей статьёй
данной серии (№ 2, 2006 год), то привожу небольшую шпаргалку по
базовым конструкциям языка программирования Scheme.
Базовый синтаксис:
Например:
Задание переменных и функций:
Например:
Дополнительные конструкции:
Пример:
Ну вот, теперь можно продолжать двигаться дальше. Если вам надо
выполнить какое-то действие один раз, то вы просто его делаете один
раз: (display "hello")
Если вам надо выполнить какое-то действие два раза, то вы просто
повторяете его: (display "hello")
(display "hello").
А что если вам нужно повторять работу снова и снова? Тогда мы сделаем
функцию, которая будет повторяться требуемое количество раз.
Называться эта функция будет repeat,
и у неё будет один параметр — количество повторов.
Алгоритм следующий.
Если количество повторов больше нуля, то:
|
Попробуем. Запустим один из доступных вам интерпретаторов Scheme,
например mzscheme, который можно найти в интернете по адресу
http://www.plt-scheme.org/software/drscheme/ и установить на вашем
компьютере.
Упражнение1:
Попробуйте написать функцию, которая будет выводить на экран "1"
заданное количество раз.
Упражнение2:
Попробуйте написать функцию, которая будет выводить на экран натуральные
числа от "1" до заданного числа. Порядок вывода чисел не важен.
Самое время вспомнить, что в Scheme можно передавать функцию в качестве
параметра. Усовершенствуем repeat,
так, чтобы мы смогли повторять произвольные действия заданное
количество раз.
Пусть новая версия принимает два параметра, первый — количество
повторов, второй — функция, которую надо запустить.
Теперь повторять можно разные действия:
Не надо делать лишних действий, если их можно избежать. Последний
вариант функции repeat, очень
хорош, но ... зачем каждый раз давать функции имя, если нужно просто её
выполнить? А можно ли вообще создать функцию, но не давать ей имя?
Оказывается можно. В языке есть специальная инструкция, которая говорит
«создать функцию».
Пример:
Оказывается, последняя конструкция то же самое, что и:
Вот мы с вами открыли ещё один способ определять функции с именами:
сначала создаём, затем даём имя. Давайте-ка теперь «повторим» действия,
не давая имена функциям:
Для repeat используются функции без параметров, поэтому в
конструкции lambda пустая пара
скобок.
Проведём следующую работу:
А как бы нам сразу взять три числа и увеличить их на единицу одним
махом? Для этого надо «связать» эти числа вместе. Один из способов
склеивания — список. Создаётся список следующей конструкцией
Пример:
Scheme также предоставляет функцию:
возвращает список, в котором каждый элемент есть результат
применения функции <функция>
к элементу исходного списка.
Пример:
Вспомним про lambda и решим
задачу, которую поставили себе в начале этого раздела:
А можно даже и список не вводить как дополнительную переменную.
Упражнение 3:
Пользуясь функциями write (для печати списка на экране) и map, напишите
функцию, которая будет выводить на экран список, увеличенный на заданное
число, например (print-it 5 (list 1
2 3)) выведет "(6 7 8)"
А как написать функцию, которая последовательно будет перемещаться
по заданному списку и выводить каждый элемент этого списка? Для этого
нам только надо знать следующие инструкции:
Пример:
Проще говоря, функция car возвращает голову списка, а cdr —
оставшийся хвост списка.
Имя функции print-list.
Единственный параметр — исходный список.
Алгоритм работы нашей функции следующий.
Если список не пуст, то:
|
Поэкспериментируем в интерпретаторе:
Упражнение 4:
Поэкспериментируйте в интерпретаторе с функциями "car", "cdr" и "null?"
Упражнение 5:
Напишите функцию, которая будет вычислять длину списка. Длина пустого
списка — ноль.
Упражнение 6:
Пользуясь изученными "car","cdr" и "null?" напишите функцию, которая
будет применять заданную
функцию к каждому элементу данного списка, например, (for-each-element display (list 1 2 3))
должна напечатать "123".
Напишите новую версию print-list, пользуясь только что созданной
функцией.
Упражнение 7:
Напишите функцию, которая будет принимать на вход два списка и
возвращать список из попарных сумм элементов, например (plus
(list 1 2) (list 5 6)) вернёт список из 6 и 8.
Упражнение 8:
Попробуйте решить задачу 8 с помощью функции map — правильный ответ вас
сильно удивит.