User talk:Paymin sergey

Paymin sergey (discuss • contribs) 17:27, 19 September 2015 (UTC)Ниже даётся перевод "Introduction to newLISP" на русский язык. Автором newLISP позиционируется, в том числе, и как язык для непрограммистов. Это действительно так, но его рапространению в этом качестве мешает необходимость знать английский язык. Хочется восполнить этот пробел - newLISP этого заслуживает.

Введение в newLISP
Оглавление.

ОСНОВЫ
Начало работы в newLISP; списки, символы, вычисления, запрет вычислений (quote)

НАЧАЛО РАБОТЫ
По завершении установки лисп у вас появятся различные пути для его запуска. Самый прямой путь - запуск интерпретатора в командной строке консоли или окне терминала - набором команды newlisp.

Это прекрасный способ для опробывания коротких выражений, проверки идей и отладки. Вы можете писать многострочный код, заключая его между [cmd] и [/cmd]. В новой версии newlisp вы можете просто нажать клавишу enter в пустой строке перед началом блока с кодом и в пустой строке после него.

Графический интерфейс для newLISP, newLISP-GS, предоставляет графический инструментарий для newLISP приложений, а также среду разработки для написания и проверки кода: newLISP-редактор. В Windows он устанавливается в виде иконки на рабочий стол и папки в стартовом меню приложений. В MacOS пакет приложения и иконка размещается в папке приложений. newLISP-GS поддерживает многовкладочные окна, подсветку синтаксиса и монитор для показа результата запуска вашего кода. Здесь рисунок редактора. Первой строкой скрипта в -nix должна быть следующей:

или

Если вы предпочитаете запускать newlisp во внешнем редакторе, вам придётся больше использовать функцию println для просмотра значений, возвращаемых каждой функцией или выражением. В общем, для завершения newlisp-скрипта или консольной сессии используйте функцию exit:

ТРИ ОСНОВНЫХ ПРАВИЛА ЛИСПА
Вы должны усвоить только три правила программирования в newLISP.

ПРАВИЛО 1: список - это последовательность элементов, заключённых в парные скобки.
Список -это основная структура данных в newLISP,а также путь для написания ваших программ. Но примеров другого типа просто нет - поэтому придётся выучить следующие два правила.

ПРАВИЛО 2: первый элемент списка особенный.
Когда newLISP видит список, он рассматривает первый элемент как функцию, а затем пытается использовать оставшиеся элементы как необходимую для этой функции информацию. Список состоит из трёх элементов: вызова функции + и двух последующих чисел. Когда newLISP видит этот список, он вычисляет его и возвращает значение 4 (конечно). Заметим, что первый элемент рассматривался newLISP-ом как функция, а оставшиеся элементы были интерпретированы как аргументы этой функции - числа, которые функция ожидает. Ниже приведены примеры, демонстрирующие эти первые два правила. возвращает 45.Функция + складывает все числа в списке. возвращает 1.5 как наибольшее число в списке. Опять-же,нет ограничений (что резонно) на длину списка: если функция в состоянии принять 137 элементов (любая из них и +, и max), то вы можете передать ей 137 элементов. печатает строку символов "the sun has put his hat on". (Она также возвращает строку, поэтому, работая в консоли, вы часто можете наблюдать дважды одно и то же). Функция print может распечатать одиночную строку символов, или вы можете вывести на печать последовательность элементов: которая печатает два числа и три строки (впрочем, неважно отформатированых, так как вы ещё не знакомы с функцией format). Функция directory выдаёт листинг указанного каталога, в нашем случае корневого "/". Если вы не указали конкретный каталог, выводится список текущей директории Это функция read-file, которая читает содержимое текстового файла: Здесь функции нужен единственный элемент - имя файла - и вам возвращается содержимое этого файла в виде строки. Это типичные примеры построения программных блоков newLISP - список содержащий вызов функции,с последующей всевозможной информацией, которая потребуется функциии. В newLISP существует около 380 функций, и вы можете получить в Руководстве newLISP исчерпывающую информацию об этих функциях и о том, как их использовать. Вы можете попробовать эти примеры. Если вы используете newLISP в терминале, просто наберите их в нём. Если вы набираете программный код в текстовом редакторе и запускаете его как скрипт, то чтобы увидеть результат вызова функции нужно заключить выражение в функцию println. Например, выражение напечатает результат выполнения функции read-file. Любое выражение newLISP возвращает значение. Даже println возвращает значение. Вы можете сказать, что процесс печати, на самом деле, является побочным эффектом, а основной задачей этой функции является возврат значения. Должны вам заметить, что когда функция println используется в окне консоли, вы видите возвращаемое значение дважды: сначала как напечатанное выражение, и повторно, как возвращаемое вызываемой функцией значение (самый верхний уровень, в данном случае). Есть ещё одна полезная вещь, которую нужно рассмотреть, прежде чем перейдём к третьему правилу. ==ВЛОЖЕННЫЕ СПИСКИ== Мы уже сталкивались со списком, вложенным внутрь другого. Здесь другие примеры: Когда newLISPвидит это, он рассуждает следующим образом: М-м-м, давайте начнём с первого из вложенных списков. Я могу выполнить легко. Значением этого выражения будет 3. Я также легко могу выполнить второй список Он вычисляется в 7. Если я заменю вложенные списки их значениями, я получаю и, также легко вычислив его, возвращаю 21 как значение этого выражения. Видите эти две круглые скобки в конце первой строки, после числа 4? Они обе необходимы: первая завершает список (+ 3 4), а вторая - многоступенчатую операцию, начинающуюся с (*. При написании более сложного кода, вы обнаружите, что вводите списки внутри списков внутри списков внутри списков, и вы должны будете завершать всё более сложные определения полудюжиной правых круглых скобок. Хороший редактор поможет вам следить за этим. Но вам не придётся беспокоиться о пробелах, разделителях строки, различных знаках препинания, обязательных отступах. От того, что и данные, и код хранятся одинаковым образом, в списках, вы можете свободно перемешивать их. Но об этом попозже. Многих людей при первом знакомстве с ЛИСПом, пугает обилие скобок. Другие указывают на их сходство с обрезанными ногтями или расшифровывают слово LISP как Lots of Irritating Silly Parentheses (Множество Бессмысленных Раздражающих Скобок). Но мне скобки напоминают маленькие ручки, которые поддерживают мысли в newLISP. Если вы редактируете код в хорошем редакторе, вы можете легко перемещать и редактировать мысль, захватывая её этими руками, и легко выделять мысль по парным круглым скобкам. Вскоре вы придёте к выводу, что круглые скобки гораздо более полезны, чем вы думали сначала. ==ЦИТРОВАНИЕ ПРЕДОТВРАЩАЕТ ВЫЧИСЛЕНИЕ== Сейчас вы можете встретиться с третьим правилом программирования в newLISP. ==ПРАВИЛО 3: ЦИТИРОВАНИЕ ПРЕДОТВРАЩАЕТ ВЫЧИСЛЕНИЕ== Для предотвращения вычисления чего-либо, зацитируйте это. Сравните две строки Первая строка - это список, который содержит функцию и два числа. Во второй строке список зацитирован - вставкой одиночной кавычки или апострофа '. Вам не нужно ставить второй апостроф в конце, после закрывающей круглой скобки, так как достаточно первого. Первое выражение newLISP обрабатывает в обычном порядке, с энтузиазмом вычисляет список и возвращает число 4.Но обнаружив вертикальный апостроф во втором выражении, newLISP даже не подумает вычислять его подстановкой чисел, он просто вернёт список как есть невычисленным. Этот знак прямого апострофа в newLISP выполняет ту же работу, что и открывающие и закрывающие кавычки в английском языке - они сообщают читателю, что слово или фраза будет интерпретирована не как обычно, а особым образом: в нестандартном или ироническом значении, в виде прямой речи или в переносном смысле. Итак, почему вам может понадобиться запретить newLISP вычисление выражения, т.е., рассматривать первый элемент списка как функцию? Вскоре вы встретитесь с примерами, в которых рассматриваются такие случаи. Например, вы храните информацию в виде списка и не хотите, чтобы newLISP обрабатывал этот список обычным образом: Вы не желаете, чтобы newLISP рассматривал 2006 и "Artur" в качестве функции. Кроме того, 2006 неправильное имя функции, так как начинается с цифры; также имя функции не может начинаться с двойных кавычек. Поэтому программа в любом случае будет превана сообщением об ошибке. Цитирование поможет избежать этого и список будет вычислен сам в себя без изменений: Способность newLISP трактовать выражения как данные - и данные как выражения - подробно будет рассмотрена позже. Для цитирования символов и списков newLISP использует вертикальный апостроф (ASCII код 39). Иногда текствые редакторы и другие программы заменяют этот простой вертикальный апостроф на фигурные кавычки. Они не будут выполнять функцию цитирования, поэтому вам нужно будет заменить все эти кавычки на вертикальный апостроф. ===СИМВОЛЫ И ЦИТИРОВАНИЕ=== Символ - это сущность в newLISP, у которого есть имя. Вы определяете его в своём коде и назначаете ему имя. Затем вы можете ссылаться на него, используя его имя вместо содержимого. Например, после определения появляется новый символ с именем alphabet, чьим значением будет строка, содержащая все буквы английского алфавита. Функция set сохраняет строку литер от a до z в символе alphabet. Теперь символ alphabet может использоваться повсеместно и будет вычисляться в алфавит где-бы он ни использовался. Когда вы захотите использовать 26 букв алфавита, используйте этот символ без цитирования. Например, здесь используется функция верхнего регистра upper-case: Я использую символ без его цитирования, так как хочу, чтобы newLISP использовал значение символа, а не его имя. Меня на самом деле интересует не слово alphabet в верхнем регистре, а сам алфавит. newLISP не навсегда изменяет значение символа в этом примере, функция upper-case всегда создаёт и возвращает новую строку, оставляя неизменной хранившуюся в символе. Символ соответствует переменной в других языках программирования. Фактически, newLISP не использует символы точно также, как используются пременные в других языках. Частично, из-за того, что значения постоянно возвращаются выражениями и передаются без сохранения прямиком в другие выражения. К примеру, в следующем коде каждая функция предаёт свой результат прямо следующей охватывающей функции: upper-case отдаёт свой результат функции first, та, в свою очередь, println, которая одновременно, печатает его и даёт вам строку как возвращаемое значение. Поэтому нет нужды для промежуточного сохранения значения. Но есть много других мест,где вам пригодятся символы. Здесь приводятся ещё два примера с использованием зацитированных символов: В первом примере я не зацитировал список (+ 2 2) - newLISP вычисляет его как 4, затем присваиавает 4 символу x, который вычисляется в 4: Во втором примере список (+ 2 2) зацитирован. Это значит, что символ y теперь хранит список, а не число и когда-бы newlisp не встретил символ y,будет возвращен список, а не число 4 (конечно, если вы успешно зацитировали символ вначале). Таким образом, согласноэтому документу

===ПРИСВАИВАНИЕ И ОПРЕДЕЛЕНИЕ СИМВОЛОВ=== Существуют различные способы создания и присваивания значений символам. Вы можете использовать фнукции define или set, как показано ниже: Функция set предполагает, что далее обязательно последует символ, и сразу вычисляет его как первый аргумент. Поэтому нужно цитировать символ для предотвращения его вычисления, потому что он может быть вычислен не в символ, а во что-то другое (что будет ошибкой), или применять выражение, которое вычисляется в символ. Для функции define не требуется цитирования аргумента. Для присваивания значений символам можно использовать функции setq и setf. Они воспринимают символ или ссылку на него как свой первый аргумент, поэтому, в данном случае, цитирование не нужно: Эти две функции, действующие одинаково, могут устанавливать значения символов (переменных), списков, массивов или строк. По соглашению, setq используется призадании символов, setf при задании элементов списка или массива. define используется при определении функции. См. "Создание собственных функций" ===РАЗРУШАЮЩИЕ ФУНКЦИИ=== Некоторые функции newLISP изменяют значение символа, который они обрабатывают, или создают копию значения и возвращают её. Из-за этого их называют разрушающими (деструктивными), хотя они часто применяются при создании новых данных. В этом документе будут описаны функции, например push и  replace, как разрушающие. Это просто означает, что они изменяют значение или возвращают изменённую копию. Управление потоком Тесты, циклы, блоки, локальные символы, функции

Списки Всё, что вы должны знать о списках

Строки

APLAY и MAP Вычисление и сопоставление функций

Контексты Введение в контексты newLISP.

Макросы Управление вычислениями с помощью макросов

Работа с числами Числовые и арифметические типы и примеры

Работа с датами и временем О функциях, работающих с датой и временем

Работа с файлами Взаимодействие с файловой системой

Многозадачность Потоки, процессы, многозадачность

Работа с XML Некоторые способы обработки XML

Отладка Встроенный отладчик newLISP

Интернет Работа со встроенными сетевыми функциями newLISP

Ещё примеры Много примеров

Графический интерфейс Беглый обзор графических инструментов