SINCLAIR LOGO
"ИНФОРКОМ" всегда уделял большое внимание пропаганде языков программирования для пользователей "ZX-Spectrum". Только на страницах "ZX-РЕВЮ" уже были опубликованы "MEGA BASIC" и три версии языка "BETA BASIC". He прекращаются наши публикации, посвященные АССЕМБЛЕРу. Еще ранее, в 1989 - 1990 г.г. в виде брошюр мы выпустили методички, посвященные языкам "LASER BASIC", ПАСКАЛЬ (HP4T) и "ZX-FORTH".
Сегодня мы начинаем публикацию языка программирования "ЛОГО". Об этом языке написано уже немало. Имеется достаточный выбор отечественной литературы и мы не стали бы повторяться, если бы не одно маленькое обстоятельство. Дело в том, что доступные книги по "ЛОГО" никак не привязаны к компьютеру "Спектрум". Мы же предлагаем Вашему внимание книгу, которая так и называется "LOGO on the SINCLAIR SPECTRUM". Таким образом, все, что Вы почерпнете из этой серии статей, вполне может быть использовано Вами в работе с вашим компьютером. Дело остается за малым - найти и запустить программу и освоить новый язык. Не знаем, как обстоит дело с этой программой на наших рынках сейчас, но в конце 80-х она была распространена очень широко и достать ее не было никаких проблем. Автор книги - известный английский программист и разработчик обучающего программного обеспечения Грэхем Филд. Авторизованный перевод с английского языка и редакция - наши.
1. Что такое "ЛОГО".
ЛОГО - это язык программирования, начало разработки которого было положено в Массачусетском Технологическом институте в 1967 году.
В его основе лежит концепция подготовки языка, удобного как для подготовки детей к основам компьтерной грамотности, так и для решения математических задач и задач, относящихся к области искусственного интеллекта. Использование этого языка программирования для этих целей стало возможным в результате значительного объема исследований, проведенных как в МТИ, так и в других научных и учебных центрах США и Европы, в частности, в Эдинбургском университете.
Уже первый опыт использования этого языка показал его высокую эффективность в обучении детей, а также особый интерес к нему не только со стороны учащихся, но и со стороны родителей и педагогов. Вместе с тем, ЛОГО не следует рассматривать только с этой стороны. Это не просто игрушка и в опытных руках он может быть серьезным инструментом. У ЛОГО есть ряд значительных преимуществ по сравнению, например с БЕЙСИКом и он может быть вполне использован в качестве универсального средства решения повседневных задач на компьютерах бытового класса. Итак, несмотря на то, что ЛОГО прост в освоении детьми и лицами, не имеющими никакой компьютерной подготовки, он является мощным инструментальным средством, обеспечивающим удобный доступ к ресурсам компьютера.
"Черепашка".
Для того, чтобы проще приобщить детей к ЛОГО, было изобретено специальное механическое устройство - "Черепашка". Оно представляет собой маленькую механическую тележку с электродвигателем, подключенную к компьютеру с помощью проводов. Тележка может кататься по полу, по столу и т.п., но как правило ее запускают по большому листу бумаги. На тележке установлен держатель, в котором закрепляется перо, карандаш, фломастер. Перо может подниматься и опускаться по командам от компьютера. В случае перемещения "черепашки" по бумаге с опущенным пером, вычерчивается линия, соответствующая траектории движения. Для управления "черепашкой" служит программа, написанная на ЛОГО.
В принципе, "Спектрум" тоже может управлять подобной "черепашкой", как и многими другими электромеханическими устройствами, но мы от нее отвлечемся и будем думать о ней, имея дело с кусором на экране телевизора, с помощью которого будем строить различные простейшие геометрические фигуры, за которыми так и закрепилось в литературе название "черепашья графика".
Вся прелесть (и мощь) ЛОГО состоит в том, что если Вы один раз "объяснили" компьютеру как надо исполнять ту или иную задачу, Вы можете больше никогда ему этого не "объяснять". Для этого надо Вашему объяснению присвоить какое-либо имя. После этого данная задача становится для компьютера известной ему процедурой и впоследствии, когда Вам опять потребуется исполнить такую же задачу, достаточно только назвать имя нужной процедуры. Получается так, что по мере того, как в своем понимании программирования развиваетесь Вы, также параллельно вместе с Вами развивается и Ваш компьютер. Единственным ограничением при этом является размер памяти Вашей машины, но у Вас есть возможность сохранять готовые процедуры на магнитной ленте и загружать в память только те, которые нужны для решения текущей проблемы.
ЛОГО был разработан специалистами, основным направлением исследований которых является искусственный интеллект, главная проблема которого состоит в изучении приемов мышления человека и введении аналогичных приемов в компьютер. Это исследование привело в свое время к созданию языка программирования ЛИСП, основная задача которого состоит в обработке различный списков данных. К сожалению, оказалось, что этот язык труден для усвоения. Может быть он и не столь труден, как это кажется начинающим, но тем не менее он по крайней мере неудобен хотя бы тем, что содержит в своей основе многие специфические термины, которые относились к конкретным особенностям той ЭВМ, на которой он создавался и которая уже давним давно не существует. ЛОГО родился, как изящная альтернатива, сочетающая методический подход ЛИСПа с доступностью терминологии и естественной наглядностью.
К сожалению, по отношению к ЛОГО сложилось обывательское негативное представление о том, что "черепашья графика" - это основной аспект языка. Есть даже некоторые несведущие люди, убежденные в том, что это единственная область его применения. В последние годы даже появились некоторые программы, в той числе и высококлассные, которые занимаются "черепашьей графикой" и потому содержат слово "ЛОГО" в своих названиях. "СИНКЛЕР ЛОГО" к ним не относится. Эта версия языка для компьютера "Спектрум" содержит все возможности оригинала и даже добавляет некоторые (например обращение к подпрограммам в машинных кодах), которые связаны со спецификой компьютера и не содержатся в эталонном языке, но могут быть очень полезны авторам неординарных программ.
Как и другие языки программирования, ЛОГО имеет немало специфических терминов. Многие не любят новой терминологии и боятся ее во всех областях, кроме той области, в которой сами являются специалистами. Но, тем не менее, некоторые термины все-таки необходимы, если мы хотим серьезно обсуждать возможности нового языка и смотреть, как они соотносятся с другими языками. Вы ничуть не хуже будете водить машину, если не будете знать, что те четыре штуковины, которые торчат из двигателя, называются свечами зажигания. Но это знание немного улучшит ваше положение, когда в один прекрасный день Ваш автонобиль не заведется. Оно поможет понять что произошло, когда кто-то более опытный объяснит Вам ситуацию и пригодится при покупке запчастей.
Эта книга не перенасыщена терминологией и не шокирует начинающего читателя. Все необходимые технические термины будут разбираться по мере их появления на простых и понятных примерах.
ЛОГО и БЕЙСИК
Для тех, кто уже знаком с БЕЙСИКом, мы дадим краткое сравнение этих языков. Если же БЕЙСИК Вам еще неизвестен, то этот раздел Вы можете просто пропустить.
Эти языки во многом различаются. Наверное наиболее очевидным отличием, сразу бросающимся в глаза, является то, что в ЛОГО нет номеров строк в программе. Они просто не нужны. Если Вам нужно внести изменения в часть программы, написанной на ЛОГО, Вы должны воспользоваться программой-редактором, которая является частью ЛОГО-системы. Этот редактор отличается от того строчного редактора, с который Вы имеете дело на "Спектруме". С его помощью можно обрабатывать не одну программную строку, а сразу целую процедуру или даже несколько. И этот редактор намного более удобен, чем тот, с которым Вы работаете в стандартном БЕЙСИКе.
Процедуры ЛОГО обычно короче и даже намного короче, чем программы БЕЙСИКа. Благодаря этому их легче писать, проще отлаживать и легче понимать, чем БЕЙСИК-программу. Редактор может одновременно обрабатывать большее количество строк, чем помещается на одном экране, но в ЛОГО не считается хорошей практикой делать процедуры столь длинными.
Еще одно необычное отличие состоит в том, что если Вы привыкли к тому, что в памяти компьютера может содержаться одновременно только одна БЕЙСИК-программа, то в ЛОГО одновременно в памяти могут быть несколько совершенно не связанных друг с другом процедур.
Еще одно, незаметное на первый взгляд отличие - то, что каждый оператор БЕЙСИКа имеет собственную структуру и всегда должен быть записан только в соответствии с ней. ЛОГО же, с другой стороны, имеет только одну допустимую структуру для своих операторов и две небольших вариации, которые не обязательны, а существуют только для большего удобства программиста.
Если Вы привыкли к тому, что операторы и функции БЕЙСИКа вызываются одним нажатием клавиши, то может быть будете несколько разочарованы, поскольку в ЛОГО этого нет. Это не позволяет сделать сама структура языка. Вам придется набирать все слова полностью по буквам. Впрочем, многие из стандартных инструкций ЛОГО имеют сокращения и к тому же в ЛОГО есть возможность самому задать сокращения для прочих слов, если Вам это хочется.
Есть еще много других отличий, о которых имеет смысл говорить после освоения обоих языков, но мы на них сейчас не будем останавливаться. Сказанного выше уже достаточно для того, чтобы Вы поняли, что ЛОГО - это совершенно особый язык программирования, не имеющий к БЕЙСИКу никакого отношения.
Диалекты ЛОГО.
Если Вы сравните те конструкции, которые увидите в этой книге, с другими книгами по ЛОГО, то найдете очень значительные отличия. Так происходит потому, что ЛОГО, по видимому, имеет большее количество диалектов, чем любые другие языки. Это, конечно, неприятно, но на самом деле ЛОГО это ведь не столько язык программирования, сколько необычный и весьма продуктивный образ мышления. Во всяком случае, основные структуры, как и возможности того или иного диалекта, будут как правило похожими. Разобравшись, Вы сможете конвертировать другие программы, написанные на ЛОГО для других компьютеров в форму, приемлемую для "Спектрума". Слова могут отличаться, но стояние за ними идеи будут теми же.
Как пользоваться этой книгой.
При написании программ на ЛОГО общепринято пользоваться прописными (заглавными) буквами и делать отступ в конструкциях языка. В этой книге будет использован тот же подход, но Вы можете им и не пользоваться, поскольку Синклер-ЛОГО - достаточно гибкий диалект. В нем можно без проблем использовать и строчные буквы, а отступ в строках - это просто удобная форма представления и чтения процедур, которая для Вас не обязательна.
Так что, если Вы наберете что-то вроде: TO SAYHELLO
PRINT [ДОБРО ПОЖАЛОВАТЬ В СИНКЛЕР-ЛОГО]
END
то на экране компьютера может получиться например так:
?to sayhello
>print [ДОБРО ПОЖАЛОВАТЬ В СИ!
>НКЛЕР-ЛОГО)
>end
Символы ? и > в начале строк и символ ! в конце - это специфические символы языка и
в свое время мы с ними разберемся.
При работе с книгой желательно попробовать приведенные в ней примеры на своем компьютере, чтобы почувствовать, как ЛОГО реагирует на те или иные команды и на ошибки. Тогда Вы научитесь использовать возможности языка наиболее эффективно. Все примеры в книге, за исключением самых примитивных, преднамеренно сделаны так, что их можно развивать и дорабатывать. Идеи о том, что еще можно доработать во многих случаях даны. В книге нет контрольных вопросов, да они и не нужны. Если в ЛОГО написанная Вами процедура работает и делает то, что должна делать, она написана верно.
2. Первые шаги.
В отличие от БЕЙСИКа, который уже встроен в ПЗУ Вашего "Спектрума", ЛОГО следует загружать с магнитной ленты. Это делается обычным способом:
LOAD ""
После загрузки на экране появится сообщение:
WELCOME TO SINCLAIR LOGO
Ниже Вы увидите вопросительный знак, служащий запросом к Вам и сигналом о том, ЛОГО ждет ваших команд. Рядом виден мигающий квадрат - это курсор. Кроме этого, Вы можете увидеть в правом нижнем углу символ "L", который означает, что от Вас ожидается ввод буквы или цифры.
Мы начнем наши эксперименты с "черепашьей графики". Наберите SHOWTURTLE и нажмите ENTER. Набор можно сделать и строчными буквами. Вы увидите, что на экране появится "черепашка" в виде стрелки. Одновременно экран разделится, оставив две нижние строки для ввода Ваших команд. Основная часть экрана будет использована для изображения результатов движений "черепашки".
Попробуйте дать команду FORWARD 50
Вы увидите, что стрелка переместилась в том направлении, в котором она указывает. Здесь надо обратить внимание на то, что слова, из которых состоят команды языка ЛОГО должны разделяться пробелами. Так что, если Вы попробуете дать команду FORVARD50, то увидите, что ЛОГО Вас не поймет. Попробуйте это, когда появится сообщение об ошибке. Вы увидите изображение стрелки в правом нижнем углу экрана. Это означает, что Вам нужно нажать какую-либо клавишу, чтобы продолжить работу.
Теперь пойдем дальше: BACK 50
Стрелка на экране вернется назад. Число 50 задает расстояние, на которое должна перенеститься "черепашка". Слова FORWARD и BACK - это процедуры, а число 50 -параметр. Трудно сказать, в каких единицах измеряется расстояние перемещения черепашки, поскольку это зависит от размеров экрана Вашего телевизора или монитора, но во всяком случае максимальное количество шагов по вертикали -175, а по горизонтали -255. Мы можем считать, что расстояние измеряется в пикселах.
Попробуйте подвигаться вперед-назад, привыкая к чувству расстояния и, когда Вам надоест двигаться по одной прямой, мы начнем осваивать новые направления. Сначала наберите CLEARSCREEN. Если Вы немного знаете английский, то уже очевидно догадались, что эта процедура очищает экран и при этом выставляет "черепашку" в исходную позицию.
Чтобы повернуть "черепашку", можно воспользоваться процедурами RIGHT (направо) и LEFT (налево). Эти процедуры должны иметь при себе параметр - угол, на который следует повернуться. Угол измеряется в градусах, полная окружность - 360 градусов, поэтому команда RIGHT 180 развернет "черепашку" в противоположном направлении, а команда LEFT 90 - повернет ее на прямой угол.
Попробуйте теперь: FORWARD 50 RIGHT 120 FORWARD 50 RIGHT 120 FORWARD 50
Вы увидите, что "черепашка" пройдет по замкнутому контуру и встанет в той точке, с которой начинала. Справедливости ради надо сказать, что ее положение не строго идентично исходному, поскольку смотрит она не туда. Но если Вы добавите еще одну команду RIGHT 120, то она встанет точно в исходное положение.
Может быть, Вы сообразили, что это простой и изящный метод рисования треугольников? Да, наверное, это так. А как быть с пятиугольниками или, скажем, с десятиугольниками? Не кажется ли Вам, что рисовать фигуру с десятью сторонами и десятью углами таким приемом было бы несколько утомительно? К счастью, ЛОГО имеет простое средство избавиться от этой неприятности. Опять исполните CLEARSCREEN и попробуйте такую команду: REPEAT 3(FORWARD 50 RIGHT 120)
Здесь используются квадратные скобки, просьба не путать с круглыми. В ЛОГО разные виды скобок используются для разных целей.
Процедура REPEAT означает, что то, что стоит в квадратных скобках, должно быть повторено. Параметр 3 указывает на количество повторений.
Команды REPEAT могут быть довольно длинными. Для того, чтобы их было удобнее читать, строку разбивают в тех местах, где удобно и продолжение строки печатают с отступом.
Если при написании команды она дойдет у Вас до правого края экрана и начнется на новой строчке не пугайтесь, этот разрыв не страшен. ЛОГО не считает строку законченной до тех пор, пока не нажата клавиша ENTER. В качестве указателя того, что команда продолжается на новой строке компьютер поставит в конце экранной строки восклицательный знак "!", служащий здесь как бы символом переноса. Поэтому, если в этой книге Вам встретится например такая команда: REPEAT 8 (FORWARD 20 RIGHT 90 FORWARD 10 RIGHT 90 FORWARD 20 LEFT 15]
Смело набирайте ее на экране в одну строку, давая ENTER только тогда, когда будет введено все до конца.
Но мощь ЛОГО, конечно же заключена не в способности многократно повторять одни и те же действия, а в способности создавать новые команды. Поскольку Вы теперь знаете, как изображается треугольник, Вы можете теперь создать команду для его изображения.
Сначала напечатайте: TEXTSCREEN
По этой команде "черепашка" будет удалена с экрана и все 22 строки экрана будут доступны для написания текста. А теперь делайте так: TO TRIANGLE
(появится приглашение ">") REPEAT 3 [FORWARD 50 RIGHT 120]
На сей раз команда не будет выполнена непосредственно, поскольку оператор TO... свидетельствует о том, что Вы не рисуете треугольник в данный момент, а занимаетесь тем, что объясняете компьютеру, как это делается. Вместо этого появляется новое приглашение ">", оно означает, что Вы не закончили описание новой команды. Чтобы завершить дело, нужно набрать еще один оператор: END
Компьютер ответит Вам на это следующим сообщением:
TRIANGLE defined
Это означает, что процедура для изображения треугольников под именем TRIANGLE определена и теперь она известна компьютеру.
После этого на экране появится приглашение ">". Оно означает, что ЛОГО находится в командном режиме и ждет от Вас ввода команды. Перейдите к "черепашке" командой SHOWTURTLE и дайте команду TRIANGLE. Если все было сделано правильно, треугольник будет нарисован. Отныне команда TRIANGLE не менее знакома компьютеру, чем команды FORWARD и BACK.
Более того, теперь Вы можете встраивать команду TRIANGLE в другие, еще более мощные команды. Попробуйте, например:
REPEAT 12 [TRIANGLE RIGHT 30]
- и посмотрите, что будет нарисовано на экране. Попробуйте также самостоятельно оформить эту команду в процедуру и дайте ей имя по вкусу.
Развивая мысль, мы с Вами попробуем нарисовать человечка. Он (или она) будет состоять из квадратной головы, туловища, которое будет изображено одной прямой линией, пары прямых рук и пары прямых ног (см. рис. 1).
Рис. 1.
Программа выглядит очень просто:
TO MAN
HEAD (голова)
BODY (тело)
LEGS (ноги)
ARMS (руки)
END
Можете набрать эту процедуру. Пусть пока Вас не смущает, что ни мы, ни компьютер не знаем пока определения процедур HEAD, BODY, LEGS и ARMS. Мы их еще напишем. Если при их написании Вам захочется посмотреть, как они работают, просто перейдите в командный режим (курсор "?") и дайте имя команды.
Итак, "голову" мы изобразим, как прямоугольник и процедура очень похожа на ту, которая изображала треугольники. Но нам надо еще после всего поместить "черепашку" в центр нижней стороны и развернуть ее вниз, чтобы она была готова перейти к рисованию "тела". Для этого потребуются дополнительно три команды. В целом процедура HEAD будет выглядеть так:
TO HEAD
REPEAT 4 [FORWARD 20 RIGHT 90] RIGHT 90 FORWARD 10 RIGHT 90
END
"Тело" еще проще:
TO BODY
FORWARD 40
END
Для изображения "ног" развернем слегка "черепашку" влево, переместим вперед, вернем назад, повернем вправо на вдвое больший угол, чем в начале, опять вперед и назад и снова развернем влево, возвратив в первоначальное положение.
TO LEGS LEFT 30 FORWARD 30 BACK 30 RIGHT 60 FORWARD 30 BACK 30 LEFT 30
END
Если Вы посмотрите на рисунок, то увидите, что "руки" ничем принципиально от "ног" не отличаются, поэтому для изображения "рук" достаточно отогнать "черепашку" назад и пририсовать к "телу" пару "ног" на уровне "плеч".
TO ARMS BACK 35
LEGS
END
Обратите внимание на саму методику работы. Вы видели, как мы упростили задачу рисования человечка до четырех задач рисования его отдельных частей. Это очень удобный метод программирования. Он состоит в расчленении одной большой задачи на группу более простых, с каждой из которых можно заниматься порознь. Их, в свою очередь, тоже можно дробить до тех пор, пока вся задача, как бы сложна она ни была, не будет сведена к элементарнейшим операциям.
ИМЕННО ДЛЯ ТАКОГО СТИЛЯ ПРОГРАММИРОВАНИЯ ЯЗЫК ЛОГО И ПРЕДНАЗНАЧЕН.
Если Вы в восторге от того, что нарисовали, можете вывести рисунок на принтер по команде COPYSCREEN.
Редактирование.
Если до сих пор Вы не сделали ни одной ошибки, считайте, что Вам повезло, но надо все-таки знать, каким образом можно внести изменения и исправления в свои процедуры. Для этого служит редактор (editor). Он вызывается по команде EDIT, после которой надо указать имя процедуры, которую Вы хотите переработать, например:
EDIT "LEGS
На экране появится текст процедуры LEGS. Курсор перемещается обычными "синклеровскими" курсорными клавишами 5,6,7,8 в сочетании с CAPS SHIFT.
Нажатие клавиши ENTER в той позиции, где стоит курсор, создает новую строку. Вы можете добавить новый текст, например PRINT "HELLO.
Стирание выполняется как обычно с помощью DELETE (CAPS SHIFT + 0).
При редактировании Вы можете воспользоваться и расширенным режимом (курсор "E"). После одновременного нажатия CAPS SHIFT и SYMB SHIFT в правом нижнем углу загорится символ "E".
В E-режиме курсорные клавиши действуют немного не так. Совместно с CAPS SHIFT клавиши 5 и 8 "перегоняют" курсор в начало или конец текущей строки, а клавиши 6 и 7 - в нижнюю или в верхнюю строку экрана. Можно перемещать курсор и на еще большие расстояния. Так, в этом режиме при нажатии клавиши "B" Вы попадете в начало текста (BEGIN), а при нажатии клавиши "E" - в конец текста, соответственно (END). Это очень удобно при редактировании процедур, длина которых больше, чем размер экрана.
Еще одно огромное удобство в этом режиме предоставляют клавиши "Y" и "R". С их помощью можно переносить строки программы с места на место. Попробуйте выставить курсор на строке RIGHT 60, затем войдите в E-режим и нажмите "Y". Строка RIGHT 60 исчезнет с экрана, но она не пропала окончательно, а осталась в памяти компьютера. Опустите курсор на две строки вниз и в E-режиме нажмите клавишу "R" - строка RIGHT 60 появится на новом месте.
Не бойтесь ничего испортить, поработайте с редактором. Любой редактор имеет свои особенности и к ним надо привыкнуть. Время, затраченное на эксперименты, многократно окупится в будущем.
Выйти из редактора можно двумя способами.
Если Вы не хотите, чтобы все сделанные Вами изменения отразились на программе, Вы можете нажать CAPS SHIFT и SPACE одновременно.
С другой стороны, если Вам надо, чтобы ваши изменения были зафиксированы, выход выполняется нажатием клавиши "C" в E-режиме.
У Вас есть возможность использования клавиш редактора и тогда, когда Вы не находитесь в самом редакторе. Так, например, если при наборе текста Вы заметите, что сделали ошибку, можете "перегнать" курсор и внести исправление до того, как была нажата клавиша ENTER и строка ушла в память компьютера.
Если Вы войдете в редактор, задав имя процедуры, которая до сих пор еще не была определена, то компьютер подумает, что Вы хотите создать новую процедуру. В этом случае перед вами будет пустой экран и слово "TO, напечатанное в его начале. Таким образом, у Вас есть еще один метод создания процедур, отличающийся от того, который мы рассмотрели ранее. В принципе, этот путь более удобный, т.к. к вашим услугам все имеющиеся ресурсы редактора, в том числе и такие, как вставка новых строк. Те, кто попробовал программировать самостоятельно, знают как это важно.
Сохранение программ на кассете.
Мы дошли то той точки, где Вам может быть захочется сохранить только что написанные процедуры для дальнейшего использования, выключить компьютер и немного отдохнуть. Если просто выключить "Спектрум", то все, что хранилось в его памяти, будет навсегда утрачено. Даже если Вам и нет нужды сохранять результаты своих экспериментов, Вы все же попробуйте это сделать, чтобы убедиться, что все идет нормально.
Как и большинство языков программирования, ЛОГО имеет дело с "файлами" (так мы будем называть блоки информации, записанные на магнитофонной ленте (или на диске и т.п.). Каждый файл имеет свое собственное имя. В ЛОГО имена файлов (в отличие от прочих ключевых слов) не могут иметь более 7 символов. Это ограничение в данном случае не связано с ЛОГО, оно относится к самому "Спектруму". Так, например, если мы хотим сохранить процедуры, которые использовались при рисовании человечка в файле под именем PERSON, наберите:
SAVE "PERSON [MAN HEAD BODY LEGS!
ARMS] <ENTER>
Включите магнитофон на запись и нажмите любую клавишу. Выгрузка идет, как обычно. По окончании сохранения файла на экране появится приглашение "?".
Если теперь Вам надо будет загрузить этот пакет процедур обратно в память компьютера, Вы можете делать следующим образом: LOAD "PERSON <ENTER>
Обслуживание памяти.
Система ЛОГО занимает часть памяти Вашего компьютера. Еще часть памяти расходует сам ЛОГО, отслеживая ход исполняемой работы. Нужна также память для хранения промежуточных результатов вычислений. Так, например при расчете 2+5-3 компьютер сначала долже найти 2+5 и запомнить где-то этот промежуточный результат. Оставшаяся часть памяти может быть использована для хранения Вашей информации и созданных Вами процедур. Мы назовем эту часть памяти "рабочей областью".
Рано или поздно программист так или иначе столкнется с проблемой нехватки памяти в рабочей области. В этот момент ему было бы чрезвычайно важно узнать, какие же процедуры хранятся у него сейчас в памяти. Так, например, возможным выходом из создавшегося положения могло бы быть удаление части процедур, если они для работы не нужны.
Для этой цели ЛОГО имеет несколько встроенных команд. Вы можете попробовать их в работе, но для того, чтобы увидеть, как они действуют, надо, чтобы в памяти сейчас у Вас было несколько Ваших процедур. Так что если их нет, то либо наберите их, либо загрузите с ленты (если при прочтении прошлого параграфа Вы их отгрузили).
Первая команда, которую мы рассмотрим - это команда POTS. Название может быть выглядит не очень осмысленным, но это даже хорошо, так ее проще запомнить. Расшифровывается она, как Print Out TitleS (распечатать заголовки). По этой команде Вы можете получить, например вот такой результат: TO TRIANGLE TO MAN TO HEAD TO ARMS TO BODY TO LEGS
Конечно это не все процедуры, которые знакомы для ЛОГО. Мы, например, знаем, что ЛОГО понимает такие процедуры, как FORWARD, BACK, RIGHT, LEFT и др. Но они по команде POTS не распечатываются, поскольку являются встроенными в систему. Это обязательные элементы языка, их еще называют "примитивами".
Другая команда с не менее нелепым названием - POPS означает Print Out ProcedureS (распечатать процедуры) выполняет печать всех Ваших процедур одну за другой. Так Вы можете их просмотреть.
Просмотреть одну какую-либо процедуру Вы можете в редакторе, вызвав ее по имени, но можно это сделать также и командой PO(Print Out). Например:
PO "LEGS
Может быть, Вы хотите, чтобы печать Ваших процедур производилась не на экран, а на принтер? Тогда Вы можете дать команду PRINTON. Начиная с этого момента принтер станет устройством вывода информации и результат работы POTS, POPS и PO будет распечатываться на принтере. Отключить принтер и вновь перевести весь вывод на экран можно командой PRINTOFF.
Итак, Вы научились просматривать рабочую область. Освободить ее от ставших ненужными процедур можно с помощью команды ERASE. Например: ERASE "HEAD
Попробуйте это сделать, а потом дайте команду POTS для того, чтобы убедиться, что все прошло нормально. Нелишне напомнить, что перед удалением иэ памяти временно ненужных процедур стоит подумать о том, чтобы сохранить их на ленте.
И, наконец, рассмотрим команду для полного освобождения рабочей области. Это команда ERPS (ERase ProcedureS). После нее можно начинать работу сначала.
Все команды, рассмотренные в этом разделе, имеющие дело с конкретной процедурой, например EDIT, PO, ERASE должны иметь открывающие кавычки перед именем этой процедуры. Но они могут иметь после своего имени в квадратных скобках еще и список входящих в них процедур, так, как это было при рассмотрении команды SAVE. В этом случае поданная команда распространяется не только на головную процедуру, но и на все входящие, например: EDIT "ARMS [LEGS]
даст Вам возможность одновременно редактировать не только процедуру ARMS, но и процедуру LEGS. Это может быть весьма удобно например в тех случаях, когда Вы хотите перенести строку из одной процедуры в другую.
Команда PO [HEAD BODY] распечатает обе процедуры, причем первой пойдет HEAD.
Команда ERASE [MAN TRIANGLE] удалит обе процедуры из рабочей области.
Печать текста.
Если Вы хотите распечатать на экране какое-либо сообщение, Вы можете воспользоваться командой ЛОГО - PRINT. Обратите внимание на то, что если включен режим PRINTON, то с тем же успехом печать будет выполнена на принтере.
Если надо распечатать всего одно слово, то оно может быть написано после кавычек, например: PRINT "HELLO
В этом случае есть разница, какими буквами прописными или строчными Вы набрали свое слово. Напечатано оно будет точно так, как было набрано.
Если Вам надо напечатать целое предложение (иди список слов), то весь список должен быть заключен в квадратные скобки: PRINT [WELCOME TO LOGO]
Если Вы хотите напечатать пустую строку, воспользуйтесь командой PRINT " или PRINT [].
Мы продемонстрируем возможность этой команды на следующем примере, который назовем TZAR ("Царь").
TO TZAR
PRINT []
PRINT [Жил был царь]
PRINT [у царя был двор]
PRINT [На дворе был кол]
PRINT [На колу мочало]
PRINT [Не начать ли сказку! сначала?]
TZAR
END
Запустите процедуру командой TZAR. Остановить ее можно будет только нажав BREAK (CAPS SHIFT + SPACE).
3. Переменные.
В ЛОГО, как и в большинстве других языков, можно пользоваться словами для выражения каких-либо данных, например чисел. Так, например, предположим, перед Вами стоит задача рассчитать величину налога на добавочную стоимость (НДС). Предположим, что стоимость изделия - 30 руб. в этом случае Вы можете присвоить переменной PRICE значение 30. Это делается командой MAKE:
MAKE "PRICE 30
Кавычки перед словом PRICE обозначают, что это имя переменной, а не имя процедуры.
Теперь попробуйте дать команду
PRINT "PRICE
Компьютер напечатает слово PRICE. Да это и естественно, ведь кавычки перед ним говорят о том, что это просто слово, а не переменная. В то же время, есть возможность напечатать не PRICE, a то, что этим словом обозначено. Для этого может служит двоеточие. Например:
PRINT :PRICE
Теперь компьютер напечатает число 30. Итак, в команде PRINT кавычки " обозначают само слово, а двоеточие (:) обозначает значение переменной, обозначенной этим словом.
Теперь мы можем перевести на язык ЛОГО следующее утверждение: "НДС равен 20-ти процентам от стоимости изделия". Оно будет выглядеть так:
MAKE "NDS :PRICE/100*20
Итак, команда MAKE требует наличия двух аргументов. Первый - это имя переменной (слово), а второй - это то значение, которое эта переменная теперь будет иметь (например число). Не забывайте о кавычках перед словом, которое идет после MAKE. Есть случаи, когда эти кавычки не нужны, но это особые случаи.
Обратите внимание и на то, что перед словом PRICE в нашем примере стоит двоеточие. Это потому, что не слово PRICE нас интересует, а то, что за ним скрывается, его числовое значение, равное 30, которое мы хотим разделить на 100 и умножить на 20 (НДС в России в 1993 г. равен 20-ти процентам). Как видите символы умножения (*) и деления (/) совпадают с БЕЙСИКом. После того, как переменная NDS создана командой MAKE, мы можем ее напечатать:
PRINT :NDS
- и опять двоеточие, поскольку нам нужно не слово, а его значение.
В компьютерной терминологии слова PRICE и NDS называются переменными, поскольку они представляют заранее неизвестные значения, которые к тому же по ходу расчетов могут и изменяться. Посмотрите, например, как оперируют с переменной, выражающей изменяющуюся длину:
TO TRISPI
SHOWTURTLE
MAKE "LENGTH 10
REPEAT 21 [FORWARD :LENGTH RIGHT 120 MAKE "LENGTH :LENGTH +5 ]
END
Внимательно посмотрите на последнюю команду в квадратных скобках. Этой командой переменной LENGTH присваивается новое значение путем прибавления к ранее имевшемуся значению числа 5. Запустите эту процедуру и посмотрите, как она работает.
При работе с переменными ЛОГО различает прописные и строчные буквы. Так,
MAKE "NDS 7
MAKE "nds 4
создают две совершенно различные переменные.
PRINT :NDS даст 7
PRINT :nds даст 4
Это может вызвать проблемы, если Вы печатаете все в нижнем регистре и забываете ставить двоеточия в кавычки там, где это нужно. Так, наберите:
print nds
и компьютер сам трансформирует запись в
PRINT NDS
поскольку он будет полагать, что и print и nds - имена процедур.
Поставить двоеточие перед NDS будет недостаточно, придется в редакторе обратно переправить NDS на nds.
Арифметика.
Кроме арифметических знаков (*),(+) и (/), с которыми мы уже встречались, существуют также и арифметические процедуры. Так, например, процедура SUM отыскивает сумму чисел, следующих за ней. Обычно это бывают два числа, но в некоторых случаях их бывает и больше. Тогда надо ставить круглые скобки так, как показано ниже. Примеры:
PRINT SUM 2 3 5
PRINT (SUM 1 2 3 4 5) 15
Процедура PRODUCT выполняет умножение. Примеры:
PRINT PRODUCT 7 3 21
PRINT (PRODUCT 2 3 5 7) 210
Внимание: таким путем для встроенных функций могут вводиться более, чем по два аргумента. Это может вызвать проблему, если их использовать внутри квадратных скобок, например в команде REPEAT. Таких случаев следует избегать.
Продедура DIV выполняет деление. Она может использоваться только с двумя аргументами, например:
PRINT DIV 10 5 2
Внимание: в ЛОГО, как и во всех других языках деление на ноль невозможно. Проверьте и посмотрите, что будет:
PRINT DIV 5 0
Это обычная ошибка начинающих программистов, особенно часто возникающая, когда делятся две переменные:
PRINT DIV :TOTAL :NUMBER
Программисты забывают учесть, что при определенных ситуациях переменная NUMBER может принимать нулевое значение.
Для вычитания нет своей процедуры. Поэтому это действие можно выполнить либо с помощью знака (-) либо с помощью суммирования SUM с отрицательным аргументом.
PRINT 12 - 4 дает 8
Знак "минус" выполняет двойную роль. Между двумя числами он обозначает вычитание, но если он стоит перед целым числом, то обозначает, что это число отрицательное.
Во всех случаях ЛОГО пытается разобраться с тем, что Вы написали и во многие случаях делает это весьма успешно. Так,
PRINT 12-4 или
PRINT 12 - 4
будет принято успешно.
Вы можете вычесть и отрицательное число, например:
PRINT 12 - - 4 или
PRINT 12-- 4
Тем не менее, все-таки существут случаи, когда ЛОГО может быть введен в заблуждение неадекватным использованием знака "минус", поэтому на всякий случай выработайте в себе привычку всегда ставить пробелы перед знаком "минус" у отрицательного числа и не оставлять пробела между знаком "минус" и самим числом. Так, последний пример наиболее грамотно записать так:
PRINT 12 - -4
В одном выражении Вы можете объединять все четыре арифметических действия.
Например:
PRINT 3*4 + 2 дает 14
И дело вовсе не в том, что вычисления выполняются слева направо. Сравните:
PRINT 2 + 3*4 тоже дает 14
Порядок арифметических действий, принятый в ЛОГО выглядит так:
- действия в скобках;
- деление;
- умножение;
- вычитание;
- сложение.
Таким образом, Вы можете пользоваться скобками () для того, чтобы изменять естественный порядок действий. Например:
PRINT (2 + 3) * 4 даст 20
При расчете выражения, стоящего в скобках, ЛОГО придерживается естественного порядка действий. Если Вы не уверены при написании выражения в порядке его расчета, смело расставляйте скобки, чтобы порядок был именно таким, какой Вам нужен. Еще два примера:
MAKE "CENTIGRADE (:FAHRENHEIT - 32) * 5 / 9 выполняет сначала вычитание, а
MAKE "FAHRENHEIT :CENTIGRADE *9/5 + 32
выполняет деление, умножение и последним сложение.
С точки зрения арифметики все равно выполнять сначала умножение или деление, но с точки зрения ЛОГО деление лучше выполнять раньше, чтобы избежать появления слишком больших чисел, с которыми будет трудно работать.
Одна из полезнейших возможностей в использовании переменных состоит в том, что благодаря им можно создавать процедуры со вводными параметрами. Например, Вы хотите иметь процедуру SQUARE для изображения на экране квадратов различной величины. Так, SQUARE 50 должна рисовать квадрат со стороной 50 единиц, a SQUARE 100 - со стороной 100 единиц. В этом случае мы можем ввести параметр SIZE, от которого будет зависеть размер квадрата и, меняя это параметр при вызове процедуры, изменять результат ее работы. Тогда определение процедуры SQUARE будет выглядеть так:
TO SQUARE :SIZE
REPEAT 4[FORWARD :SIZE RIGHT 90]
END
В заключение в порядке эксперимента напишите процедуру POLYGON, которая должна иметь два входных параметра :SIZE и :NUMBER. Параметр SIZE задает размер стороны правильного многоугольника, а параметр NUMBER - число его сторон. Можете это сделать, модернизировав приведенную выше процедуру SQUARE. Правда, придется помозговать насчет угла поворота "черепашки" после изображения каждой стороны. Вам может помочь тот факт, известный из геометрии, что сумма углов выпуклого многоугольника равна 180*(n-2) градусов, где n - число его сторон. А пока мы прощаемся до следующего выпуска.
(Продолжение следует).