Странный синтаксис!

Странный синтаксис!: Константы Юлии

Еще немного интересного синтаксиса Джулии: юлианские константы.

введение

Если вы хоть раз в жизни занимались программированием или занимались базовой алгеброй, то вы, вероятно, знаете, что такое переменная. Переменная — это значение, которое вводится в пространство некоторых чисел для выполнения арифметических действий и, что более важно; быть изменены и иметь вариации. Хотя переменная является важным и ключевым значением, существуют также различные типы данных, которые могут быть частью их выборки или анализа данных, и это использование констант.

Константы подобны надоедливому сводному брату обычной переменной. В то время как переменная может быть видоизменена, а константа не может быть изменена. Вы также можете быть знакомы с константами, и если это так, вам может быть интересно

что странного в константах?

Хотя в константах нет ничего странного по своей сути, существует много действительно интересного синтаксиса, который можно создать с помощью констант. Как и следовало ожидать, любая константа может быть использована в качестве аргумента, если функция не изменяет тип. Поэтому есть несколько довольно интересных способов использования констант, один из которых — довольно новое дополнение к Джулии!

константы в конструкторах

С выпуском Julia 1.8 у нас теперь есть доступ к новой функции Julia, которая позволяет нам обозначать отдельные поля структуры как константы. Это означает, что теперь у нас может быть mutable struct, внутри которого все еще содержатся статические значения. Неизменяемые данные, безусловно, имеют свое место, и легко понять, почему может быть вариант использования чего-то вроде смешанного типа, в котором некоторые значения могут быть изменены, а некоторые — неизменны. Например, мы хотим сделать идентификационный номер для группы студентов, и каждая метка должна быть постоянной, потому что мы определенно не хотим, чтобы идентификационный номер менялся.

Это довольно новое дополнение не только полезно, но и невероятно просто в использовании! Начните с исходного конструктора Julia:

mutable struct Student
   id::Int64
   name::String
end

Мы можем сделать поля постоянными, просто добавив const перед объявлением любого из этих полей.

mutable struct Student
   const id::Int64
   name::String
end

Довольно легко, правда?!

Излишне говорить, что это очень долгожданное дополнение к языку, и я очень рад, что оно реализовано. Существует так много разных вариантов использования конструктора смешанного изменения, такого как этот, и я рад видеть, к чему сообщество Джулии теперь применяет это. Кроме того, если вам нужно краткое изложение некоторых основных моментов выпуска Julia 1.8, я написал целую статью на эту тему, которую вы можете прочитать здесь:



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

константы как экспорт

Теперь давайте познакомимся с концепцией, которую многие, возможно, раньше не использовали. Константы и переменные обычно не являются теми типами вещей, которые нужно экспортировать, но есть несколько довольно интересных стилей высокоуровневого и декларативного синтаксиса, которых можно достичь, используя преимущества констант. Прежде всего, как упоминалось ранее, константа может заменить переменную. Например, константа pi в Julia, конечно,

julia> pi
π = 3.1415926535897...

Поскольку это число, это новое определение означает, что мы также можем образовать его вместе с другим числом для выполнения умножения. Например, мы могли бы поставить 2 перед pi.

julia> 2pi
6.283185307179586

Точно так же мы можем сделать то же самое с другими нашими константами, такими как моя новая константа the_sun.

julia> const the_sun = 5000
5000
julia> 2the_sun
10000

То же самое можно было бы сделать, если бы это была переменная, а не константа,

julia> the_sun = 5000
5000
julia> 2the_sun
10000

Во что это можно манипулировать? Самая популярная реализация высокоуровневого синтаксиса, которую я видел, включает Measures.jl . Этот пакет использует константы для создания синтаксиса измерения для предоставления чисел. Каждая константа на самом деле является AbsoluteLength , которую Джулия затем может интерпретировать в графические измерения. На первом этапе этого подхода мы создадим новый тип MeasurementSymbol.

mutable struct MeasurementSymbol{P <: Any} end

Последняя статья Странный синтаксис!, которую я написал, на самом деле была основана на этой концепции, поэтому, если вы хотите немного познакомиться, вот ссылка на эту статью!:



Этот тип является лишь прикрытием для использования нами параметрического символизма для отправки нашего MeasurementSymbol . Теперь нам нужно импортировать оператор * из Base.

import Base: *

Это позволит нам добавлять к этому оператору новые методы. Метод, который мы собираемся добавить, будет отправлять умножение с Int64 для получения желаемого результата в пикселях, который в данном случае будет просто String с буквами px и числом внутри него.

*(i::Int64, ms::MeasurementSymbol{:px}) = "$(i)px"

Теперь нам просто нужно сделать нашу константу…

const px = MeasurementSymbol{:px}()

Наконец, мы можем использовать эту константу так же, как и раньше с pi.

5px
"5px"

заключение

В Джулии есть много действительно крутых вещей, которые можно сделать с константами. Синтаксис измерения, безусловно, потрясающий, поскольку он действительно может создать синтаксис гораздо более высокого уровня, чем многие другие доступные варианты. Этому даже способствуют обычные варианты использования констант. И затем, наконец, точка затаптывается всякий раз, когда у нас также есть константы в качестве полей. Что еще круче, так это то, что мы не ограничены традиционной алгеброй или вариантами использования благодаря множественной диспетчеризации и расширяемости языка Julia. В целом, я нахожу эту реализацию констант чрезвычайно привлекательной. Спасибо за чтение!