Есть ли у Джулии эквивалент #define? - PullRequest
3 голосов
/ 21 сентября 2019

Я реализую некоторый базовый конечный автомат, который в Джулии состоит из нескольких состояний.

В CI будет отслеживать текущее состояние, используя что-то похожее на:

#define STOP 1
#define START 2
#define ERROR 3

И затем использовать дружественные константы всравнения и т. д.

if(state == STOP) {
    printf("Stop state.\n");
}

Есть ли что-то эквивалентное #define в Юлии?

Ответы [ 2 ]

7 голосов
/ 21 сентября 2019

Вы можете использовать enum .Перечисления определяются с помощью макроса @enum:

@enum State STOP START ERROR

Это создает три константы, STOP, START и ERROR, все типа State.Это означает, что вы можете отправлять функции по типу перечисления:

import Base.println
function println(s::State)
    if s == STOP
        println("Stop state.")
    elseif s == START
        println("Start state.")
    else
        println("Error state.")
    end
end
julia> s = STOP

julia> println(s)
Stop state.

Перечисления могут быть преобразованы в целочисленные значения:

julia> Int.([STOP, START, ERROR])
3-element Array{Int64,1}:
 0
 1
 2

Как видите, целое число по умолчаниюЗначения для последовательности перечисляемых состояний начинаются с 0.Однако вы можете явно указать целочисленные значения для перечислений при использовании макроса @enum:

julia> @enum Heat LOW=1 MEDIUM=2 HIGH=3

julia> Int.([LOW, MEDIUM, HIGH])
3-element Array{Int64,1}:
 1
 2
 3

Обратите внимание, что при создании переключателя, как в приведенном выше определении println, вы можетеубедитесь, что STOP, START и ERROR являются единственно возможными значениями State объекта.Это можно продемонстрировать явным построением State объектов:

julia> State(0), State(1), State(2)
(STOP::State = 0, START::State = 1, ERROR::State = 2)

julia> State(3)
ERROR: ArgumentError: invalid value for Enum State: 3
Stacktrace:
 [1] enum_argument_error(::Symbol, ::Int64) at ./Enums.jl:34
 [2] State(::Int64) at ./Enums.jl:139
 [3] top-level scope at none:0
5 голосов
/ 21 сентября 2019

Если вы действительно хотите что-то максимально близкое к #define <Symbol> <Integer>, используйте const:

const STOP  = 1
const START = 2
const ERROR = 3
...