Julia Language
표현식
수색…
표현식 소개
표현식은 Julia의 특정 유형의 객체입니다. 아직 평가되지 않은 (즉, 실행 된) 줄리아 코드를 나타내는 표현식을 생각할 수 있습니다. 표현식을 평가할 eval()
과 같은 특정 함수와 연산이 있습니다.
예를 들어 스크립트를 작성하거나 인터프리터에 다음을 입력 할 수 있습니다. julia> 1 + 1 2
표현식을 만드는 한 가지 방법은 :()
구문을 사용하는 것입니다. 예 :
julia> MyExpression = :(1+1)
:(1 + 1)
julia> typeof(MyExpression)
Expr
우리는 이제 Expr
타입 객체를 가진다. 방금 형성되었을 때, 그것은 아무 것도하지 않습니다 - 그것은 행동 할 때까지 다른 어떤 물건처럼 주변에 있습니다. 이 경우 eval()
함수를 사용하여 표현식을 평가할 수 있습니다.
julia> eval(MyExpression)
2
따라서 우리는 다음 두 가지가 동등하다는 것을 알 수 있습니다 :
1+1
eval(:(1+1))
왜 우리는 단지 1 + 1이 무엇인지를 찾고 싶다면 eval(:(1+1))
에서 훨씬 복잡한 구문을 사용하고 싶습니까? 근본적인 이유는 코드의 한 지점에서 표현식을 정의하고 나중에 수정할 수 있으며 나중에 나중에 평가할 수 있기 때문입니다. 이것은 Julia 프로그래머에게 강력한 새로운 기능을 제공 할 수 있습니다. 표현은 줄리아에서 메타 프로그래밍 의 주요 구성 요소입니다.
표현식 생성하기
동일한 유형의 표현식을 작성하는 데 사용할 수있는 여러 가지 메소드가 있습니다. 표현식 소개 는 :()
구문을 언급했습니다. 아마도 가장 좋은 곳은 문자열입니다. 이것은 Julia에서 표현과 문자열 사이의 근본적인 유사점을 밝혀내는 데 도움이됩니다.
문자열에서 표현식 만들기
줄리아 문서에서 :
모든 줄리아 프로그램은 문자열로 시작됩니다.
다시 말해, 모든 줄리아 스크립트는 텍스트 파일에 쓰여지는 것인데, 이는 문자의 문자열 일뿐입니다. 마찬가지로, 인터프리터에 입력 된 모든 줄리아 명령은 문자의 문자열입니다. Julia 또는 다른 프로그래밍 언어의 역할은 문자의 문자열을 논리적이고 예측 가능한 방식으로 해석하고 평가하여 문자의 문자열을 사용하여 프로그래머가 컴퓨터에서 수행하고자하는 것을 설명하는 것입니다.
따라서 표현식을 만드는 한 가지 방법은 문자열에 적용된 parse()
함수를 사용하는 것입니다. 다음 표현식은 일단 평가되면 기호 x
에 2의 값을 할당합니다.
MyStr = "x = 2"
MyExpr = parse(MyStr)
julia> x
ERROR: UndefVarError: x not defined
eval(MyExpr)
julia> x
2
:()
구문을 사용하여 표현식 만들기
MyExpr2 = :(x = 2)
julia> MyExpr == MyExpr2
true
이 구문을 사용하면 Julia가 개체 이름을 기호를 참조하는 것으로 자동 처리합니다. 우리가 표현의 args
를 보면 이것을 볼 수 있습니다. 표현식 의 args
필드에 대한 자세한 내용 은 표현식 객체 필드를 참조하십시오.
julia> MyExpr2.args
2-element Array{Any,1}:
:x
2
Expr()
함수를 사용하여 식 만들기
MyExpr3 = Expr(:(=), :x, 2)
MyExpr3 == MyExpr
이 구문은 접두사 표기법을 기반으로 합니다 . 즉, Expr()
함수에 지정된 첫 번째 인수는 head
또는 접두사입니다. 나머지는 표현의 arguments
입니다. head
는 인수에 대해 수행 할 조작을 판별합니다.
이에 대한 자세한 내용 은 표현식 개체 필드를 참조하십시오.
이 구문을 사용할 때 객체에 객체와 심볼을 사용하는 것을 구별하는 것이 중요합니다. 예를 들어, 위의 예에서 표현식은 기호 2
에 값 2
를 지정합니다 :x
는 완벽하게 의미있는 연산입니다. 우리가 x
와 같은 식에서 x
를 사용했다면 무의미한 결과를 얻을 수 있습니다 :
julia> Expr(:(=), x, 5)
:(2 = 5)
마찬가지로, 우리가 볼 args
검사하면 :
julia> Expr(:(=), x, 5).args
2-element Array{Any,1}:
2
5
따라서 Expr()
함수는 식을 만들기 위해 :()
구문과 동일한 자동 변환을 수행하지 않습니다.
quote...end
사용하여 여러 줄 표현식 만들기 quote...end
MyQuote =
quote
x = 2
y = 3
end
julia> typeof(MyQuote)
Expr
quote...end
를 사용하면 args
필드에 다른 표현식을 포함하는 표현식을 만들 수 있습니다.
julia> typeof(MyQuote.args[2])
Expr
이 args
필드에 대한 자세한 내용 은 Expression Objects 필드를 참조하십시오.
표현식 생성에 대한 추가 정보
이 예제는 표현식을 만드는 기초를 제공합니다. 더 복잡한 고급 표현식 작성에 대한 자세한 내용은 예를 들어, 보간 및 표현식 및 표현식 객체 필드 를 참조하십시오.
표현식 개체의 필드
표현식 소개 에서 언급했듯이 Julia의 특정 유형의 객체가 있습니다. 따라서, 그들은 들판을 가지고 있습니다. 표현식에서 가장 많이 사용되는 두 필드는 head
와 args
입니다. 예를 들어, 식
MyExpr3 = Expr(:(=), :x, 2)
식 작성에 설명되어 있습니다. 우리는 다음과 같이 head
와 args
를 볼 수 있습니다 :
julia> MyExpr3.head
:(=)
julia> MyExpr3.args
2-element Array{Any,1}:
:x
2
표현식은 접두사 표기법을 기반으로 합니다 . 이와 같이, head
일반적으로 args
에 대해 수행 될 작업을 지정합니다. 머리는 Julia 유형 Symbol
이어야합니다.
표현식이 값을 할당 할 때 (평가 될 때), 일반적으로 :(=)
의 머리를 사용합니다. 물론 사용할 수있는 명백한 변형이 있습니다 (예 :
ex1 = Expr(:(+=), :x, 2)
: 표현 머리를 요구하십시오.
또 다른 일반적인 head
표현식입니다 :call
. 예 :
ex2 = Expr(:call, :(*), 2, 3)
eval(ex2) ## 6
접두사 표기 규칙에 따라 운영자는 왼쪽에서 오른쪽으로 계산됩니다. 따라서이 표현은 args
의 첫 번째 요소에 지정된 함수를 후속 요소에서 호출한다는 의미입니다. 우리는 비슷하게 가질 수 있습니다 :
julia> ex2a = Expr(:call, :(-), 1, 2, 3)
:(1 - 2 - 3)
또는 다른 잠재적으로 더 흥미로운 기능, 예.
julia> ex2b = Expr(:call, :rand, 2,2)
:(rand(2,2))
julia> eval(ex2b)
2x2 Array{Float64,2}:
0.429397 0.164478
0.104994 0.675745
:()
표현 작성 표기법을 사용할 때 head
자동 결정
:call
은 암시 적으로 표현의 특정 구성에서 머리로 사용됩니다.
julia> :(x + 2).head
:call
따라서 식을 작성하기위한 :()
구문을 사용하면 Julia는 사용할 올바른 머리를 자동으로 결정합니다. 비슷하게:
julia> :(x = 2).head
:(=)
실제로 Expr()
을 사용하여 표현식을 작성하는 데 올바른 머리를 사용하는 것이 확실하지 않은 경우 사용 방법에 대한 팁과 아이디어를 얻을 수있는 유용한 도구가 될 수 있습니다.
보간과 표현
표현식 생성 은 표현식이 문자열과 밀접한 관련이 있다고 언급합니다. 따라서 문자열 내의 보간 원리도 표현식과 관련이 있습니다. 예를 들어, 기본 문자열 보간에서 우리는 다음과 같은 것을 가질 수 있습니다 :
n = 2
julia> MyString = "there are $n ducks"
"there are 2 ducks"
$
기호를 사용하여 n
값을 문자열에 삽입합니다. 동일한 기술을 표현식과 함께 사용할 수 있습니다. 예 :
a = 2
ex1 = :(x = 2*$a) ## :(x = 2 * 2)
a = 3
eval(ex1)
x # 4
이것과 대조 :
a = 2
ex2 = :(x = 2*a) # :(x = 2a)
a = 3
eval(ex2)
x # 6
따라서, 제 1 예, 우리는 미리 설정된 값 발현은 평가시에 사용된다. a
두 번째 예제로, 그러나, 줄리아 컴파일러에만 볼 것이다 우리의 표현을위한 평가 시점에서 그 가치를 찾을 수 있습니다. a
표현식에 대한 외부 참조
Julia의 표현에 대한 지식을 향상시키는 데 도움이되는 유용한 웹 리소스가 많이 있습니다. 여기에는 다음이 포함됩니다.
- Julia Docs - 메타 프로그래밍
- Wikibooks - Julia Metaprogramming
- 줄리아의 매크로, 표현 등은 혼란스럽고 회색 칼훈
- 줄리아 달 - 앤드류 콜리어의 메타 프로그래밍
- Julia의 상징적 인 차별화, John Myles White
그래서 게시물 :