Серия «Изучаем Wolfram Language»

0

Изучаем Wolfram Language - 4. Синтаксис

В предыдущей статье мы рассмотрели интерфейс Wolfram Mathematica. В этой мы наконец-то приступим к изучению самого языка. Начнем с основного синтаксиса. Под синтаксисом я буду подразумевать только допустимые конструкции языка, но не сами функции.

По сравнению со многими популярными языками программирования, дизайн Wolfram Language довольно необычен. Современные популярные языки, например, Python, C# или JavaScript имеют синтаксис, состоящий из ключевых слов и определений в строгом порядке. Например, в Python для создания функции я должен написать вот такой код:

def my_func(x, y):

  return x + y

В качестве элементов самого синтаксиса здесь выступают ключевые слова def и return, специальные знаки разделяющие или группирующие код "()", ", " и ":". А так же оператор сложения и свои собственные имена - их я могу придумать любые (только если они не заняты ключевыми словами). Я всего лишь использовал одну из многих существующих конструкций в Python, а элементов синтаксиса получилось не так уж и мало. Причем считается, что относительно других языков программирования, Python имеет довольно лаконичный синтаксис.

А теперь рассмотрим основные синтаксические конструкции WL.

Комментарии

Они пишутся в колючих скобочках (**) и могут быть в любом месте кода и занимать больше одной строки:

1 + 1 (* слева 2 *) + 3 + 4 (* еще комментарий *)

Создание переменной:

x = 1

Создать несколько переменных, как это работает в Python, нельзя:

x, y, z = 1, 2, 3

Но можно присвоить значения списку переменных:

{x, y, z} = {1, 2, 3}

Важно, чтобы количество элементов в списках слева и справа совпадало. WL - язык с динамической типизацией - это значит, что переменные могут хранить значения любых типов и изменять значения не обращая внимания на тип.

x = 1

x = "string"

Очистка значения переменной

Есть несколько способов:

x =.

Или

Clear[x]

Или

ClearAll[x]

Последний вариант более надежен, так как он очищает не только значение, но и атрибуты (с которыми мы познакомимся в следующих постах).

Арифметика

Поддерживаются все типичные арифметические операции:

  • Сложение

1 + 1 (* => 2 *)

  • Вычитание

1 - 2 (* => -1 *)

  • Умножение

3 * 5 (* => 15 *)

  • Деление

9 / 3 (* => 3 *)

  • Возведение в степень

3^2 (* => 9 *)

Сравнение

Сравнивать можно все что угодно. Например числа:

1 == 2 (* => False *)

Строки:

"string1" == "String1" (* => False *)

Списки:

{1, 2, 3} == {1, 2, 3} (* => True *)

Числа разных типов:

1.0 == 1 (* => True *)

На последнем примере остановимся подробнее. Мы сравнили целое и действительное число и вернулось True. Что нужно сделать чтобы убедиться, что типы не совпадают? Сравнить при помощи точного сравнения:

1.0 === 1 (* => False *)

Отличие точного сравнения от обычного еще в том, что при обычном сравнении, если WL не знает как сравнить два выражения - то возвращается ввод:

x+y == a+b (* => x+y == a+b *)

Точное сравнение всегда гарантирует результат True или False.

x+y === a+b (* => False *)

И еще несколько операций сравнения:

1 < 2 == True (*меньше*)

2 <= 2 == True (*меньше или равно*)

3 > 2 == True (*больше*)

3 >= 3 == True (*больше или равно*)

4 != 5 == True (*неравно*)

a != b == a != b (*неравно возвращает ввод если выражения несравнимы*)

a =!= b == False (*строгое неравно*)

Логические операции

Логическое "и" при помощи &&:

x = 5

x < 6 && x > 1 == True

Логическое "или" при помощи ||:

x = 10

x > 11 || x <= 10 == True

Логическое отрицание при помощи "!":

x = 15

!(x < 5 || x > 20) == True

Создание функций:

Самая важная часть синтаксиса - это создание собственных функций:

myFunc[x_, y_] := x + y

Обратите внимание, что для функции используется знак ":=" - это отложенное присваивание. Оно означает, что код справа не выполняется во время создания определения, но выполняется во время вызова функции.

Естественно определение функции можно очистить:

ClearAll[myFunc]

Но в WL функции можно очень легко перегружать на различных типах аргументов. То есть я могу создать дополнительное определение:

myFunc[x_] := myFunc[x, 1]

И очистить только одно из определений тоже можно:

myFunc[x_] =.

Clear или ClearAll такой способ не поддерживают, а очищают все определения.

На этом на сегодня все, в следующей части мы рассмотрим основные структуры данных и способы работы с ними, всем спасибо за внимание!

Показать полностью

Изучаем Wolfram Language - 3. Интерфейс Mathematica

После того как вы запустите Mathematica (WM), вам отобразится пустой блокнот, который похож на обычный блокнот в Windows (notepad.exe). В предыдущих версиях интерфейс этого блокнота был еще более минималистичным и не содержал дополнительных кнопок под основным меню. Приступим к его изучению!

Основное меню

Меню File

Меню File

Собственно как и в любом другом приложении рабочего стола у нас есть список пунктов меню с выпадающими списками. Они все довольно стандартны и в основном не требуют разъяснений. Но я отмечу несколько важных пунктов, которые в среднем используются чаще всего:

  • File > New > (Notebook, Presenter Notebook, Package/Script > (Wolfram Language Package))

Создает новый файл - блокнот, презентацию, пакет или скрипт

  • File > Save

Сохраняет текущий файл

  • Edit > Preferences

Открывает настройки

  • Format > ..

Меню посвящённое форматированию стилей документа, ячеек и текста

  • Evaluation > (Evaluate Notebook, Evaluate Initialization Cells, Quit Kernel)

Выполняет весь код блокнота, только ячейки инициализации, останавливает ядро

Дополнительное меню

На нем можно не останавливаться подробно. Единственное, что важно знать - это то, что в большинстве случаев кнопки дополнительного меню дублируют те команды основного меню, которые статистически чаще всего используются: форматирование, выполнение кода и вставка объектов в документ.

Ячейки

То, что мы рассмотрели выше - относится к интерфейсу приложения рабочего стола. Эта часть интерфейса может различаться в разных версиях или на разных платформах. Например, в Wolfram Cloud основное меню выглядит по другому. Но самой важной частью UI в Mathematica являются ячейки. Ячейка - это основной блок, из которого состоят документы Wolfram Mathematica. Те, кто знаком с такими приложениями как Jupyter или Observablehq хорошо представляют что такое ячейки. Кроме того, пока я пишу этот текст - я также пользуюсь похожими блоками в редакторе Pikabu.

Если в пустом документе я нажму на кнопку "+", то появится выпадающее меню, в котором приложение предложит мне выбрать тип создаваемой ячейки.

Выпадающее меню с выбором типа новой ячейки

Выпадающее меню с выбором типа новой ячейки

Я выберу первый пункт "Wolrfam Language Input". Тогда создастся ячейка с типом по умолчанию:

Курсор в новой ячейке

Курсор в новой ячейке

Я создал ячейку. Справа ячейка отделена квадратной скобочкой. На скриншоте видно, что слева в данный момент располагается курсор. Теперь можно ввести любой текст:

1+1

1+1

Так как я создал input-ячейку, то она является исполняемой, т.е. Mathematica предполагает, что в таких ячейках располагается код, который можно выполнить. Для этого достаточно нажать сочетание клавиш SHIFT + ENTER.

Результат выполнения SHIFT + ENTER

Результат выполнения SHIFT + ENTER

Что мы видим в интерфейсе:

  1. input - код переданный на вход

  2. ouput - результат выполнения кода, т.е. вывод

  3. номер в истории ввода

  4. номера в истории вывода

Мы создали ячейку ввода и нажали SHIFT + ENTER. Но что произошло далее? Приложение считало из ячейки код, т.е. 1 + 1. Отправило его в интерпретатор WL. Интерпретатор вычислил этот код и вернул результат (2) в интерфейс. Интерфейс получил результат, напечатал новую ячейку с типом output и вставил в нее результат выполнения. Т.е. вывод - это тоже такая же ячейка, которая создается после выполнения ячейки с кодом.

Есть еще один способ создания ячейки ввода. Нужно кликнуть мышью в любое пустое пространство - после всех ячеек или между двумя существующими ячейками и начать набирать любой текст. Тогда точно так же создается ячейка с типом input.

Какие еще есть типы ячеек? Во-первых, они подразделяются на текстовые и исполняемые. Всего существует два типа исполняемых ячеек - input и code. Текстовых ячеек намного больше. Все типы доступные в текущем документе можно найти в выпадающем меню:

При выборе любого типа в документ в текущее положение курсора вставляется пустая ячейка. Типов довольно много, но есть несколько самых популярных. Они вставляются при помощи сочетания клавиш ALT + 1, 2, ..9:

  • ALT + 1 - заголовок

  • ALT + 2 - подзаголовок

  • ALT + 3 - раздел

  • ALT + 4 - секция

  • ALT + 5 - подсекция

  • ALT + 6 - подсекция второго уровня

  • ALT + 7 - текст

  • ALT + 8 - код

  • ALT + 9 - инпут

Как выглядят ячейки разного типа в документе

Как выглядят ячейки разного типа в документе

Первые семь ячеек на скриншоте выше текстовые, т.е. в них можно создавать форматированный текст. 8 и 9 ячейки интерпретируются как код. Разница между ними в стиле, а так же в том, что ячейки с типом code (ALT + 8) интерпретируются как ячейки инициализации.

Любую ячейку можно выделить и вызвать контекстное меню. Для этого нужно кликнуть по скобочке справа правой кнопкой мыши:

В контекстном меню можно изменить форматирование, сменить тип, выполнить, удалить и т.д.

Еще один важный момент. На скриншотам выше видно, что ячейки сгруппированы. Если ячейка имеет тип "заголовок", все для остальных типов она будет "главной" в группе. Группу ячеек можно выполнить целиком или удалить целиком. А так же вырезать, копировать и другие действия. Иерархия чем-то похожа на теги h1/h2/h3/.. в HTML.

Собственно, на этом на сегодня все. Мы коротко рассмотрели основное меню и познакомились с ячейками и их типами. Но это далеко не все. В дальнейшем мы постепенно узнаем и другие особенности UI. Но пока что нужно знать самое важное:

  1. Mathmetica - это "подсмотрщик документов" со своим специфичным интерфейсом

  2. Все документы независимо от подсмотрщика состоят из ячеек и только из них. Ячейки могут группироваться и иметь различные типы.

  3. Есть два основных вида ячеек - исполняемые и текстовые

Показать полностью 8

Изучаем Wolfram Language - 2. Первая программа

После того как среда исполнения установлена (либо пройдена регистрация в Wolfram Cloud) можно приступить к написанию кода. Если вы установили Wolfram Engine при помощи пакетного менеджера и активировали его, то необходимо выполнить в командной строке команду:

wolfamscript

После чего запустится сессия ядра Wolfram Language. Эта сессия работает в режиме REPL. Так же как cmd.exe, PowerShell или Bash. Т.е. мы вводим команду, а ядро выполняет ее и печатает результат. После запуска интерпретатора можно выполнить какой-то простой код. По традиции напишем:

Print["Hello, World!"]

В результате напечатается переданная строка. Ниже пример результата Windows Terminal:

После запуска утилиты wolframscript напечаталась текущая версия языка и ядра

После запуска утилиты wolframscript напечаталась текущая версия языка и ядра

Для завершения сессии и возврата в PowerShell (в моем случае) можно выполнить команду:

Exit[]

Все тоже самое в интерфейсе Mathematica:

Здесь можно внимательно рассмотреть интерфейс

Здесь можно внимательно рассмотреть интерфейс

И в Wolfram Cloud:

Если что это браузер Vivaldi

Если что это браузер Vivaldi

В принципе первая традиционная для каждого языка программирования программа готова. В следующей части мы подробнее познакомимся с интерфейсом Mathematica.

Всем спасибо за внимание!

Показать полностью 3

Изучаем Wolfram Language - 1. Установка

В этой серии постов мы будем изучать такой язык программирования как Wolfram Language (WL). Но прежде чем начать, установить среду исполнения. На данный момент существует несколько различных вариантов работы с языком.

Это приложение для рабочего стола. Лучший вариант для разработки на WL, но с одним очень большим недостатком - она стоит денег, а учитывая курс доллара - она стоит достаточно приличных денег. Но выход есть - найти на торрентах кейген для Wolfram Mathematica и следовать инструкции по активации. Получить актуальную версию установщика пробной версии приложения можно на официальном сайте компании разработчика - Wolfram Research Inc. Затем эту версию можно либо купить, либо использовать кейген, либо переактивировать триал с помощью новой учетной записи.

Имеет бесплатный тариф - не требует установки и просто работает в браузере. Нужно просто пройти интуитивно понятный процесс регистрации с почтой, но без смс. Лучший вариант для начинающих. Облачная версия умеет почти все тоже самое, что и десктопная за исключением тех функций, которые связаны с железом и операционной системой. Просто потому что код исполняется на серверах компании Wolfram Research.

Бесплатная (но с ограниченной лицензией) версия ядра Wolfram Language. Из плюсов - она реально бесплатная. Из минусов - запрещено использовать в коммерческих целях и запускать больше определенного количества экземпляров. Требует привязку в электронной почте. Соответственно при необходимости установить на несколько компьютеров - можно завести несколько электронных почт и привязать лицензию к ним. В чем отличие от предыдущих вариантов: устанавливает ядро локально, но без пользовательского интерфейса. Т.е. это утилита командной строки, которая запускается из консоли. Огромный плюс в том, что можно установить при помощи пакетного менеджера:

brew cask install wolfram-engine

winget install WolframEngine

Или запустить как docker-контейнер

docker pull wolframresearch/wolframengine

Независимо от того, какой вариант вы выбрали - везде будет один и тот же язык программирования и в браузере, и в Mathemetica, и в терминале.

А на этом сегодня все, всем спасибо за внимание встретимся в следующем коротком посте, где я расскажу как написать и выполнить свой первый код.

Всем спасибо за внимание!

Показать полностью
Отличная работа, все прочитано!