0

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

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

В предыдущей статье мы рассмотрели интерфейс 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 такой способ не поддерживают, а очищают все определения.

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

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества