수색…


표현식 소개

표현식은 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의 특정 유형의 객체가 있습니다. 따라서, 그들은 들판을 가지고 있습니다. 표현식에서 가장 많이 사용되는 두 필드는 headargs 입니다. 예를 들어, 식

MyExpr3 = Expr(:(=), :x, 2)

식 작성에 설명되어 있습니다. 우리는 다음과 같이 headargs 를 볼 수 있습니다 :

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의 표현에 대한 지식을 향상시키는 데 도움이되는 유용한 웹 리소스가 많이 있습니다. 여기에는 다음이 포함됩니다.

그래서 게시물 :



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow