왜 복합 표현인가?


10

이것은 내가 읽고있는 책의 예입니다.

volume = begin
    len = 10
    breadth = 20
    height = 30
    len * breadth * height
end

복합 표현식이 필요한 이유는 무엇입니까? 난 그냥 쓸 수 volume = 10 * 20 * 30또는 volume = len * breadth * height하거나하는 기능 또는 익명 함수를 작성 ...

왜 사용 하는가 beginend? 또는 아마도 더 좋은 질문 일 것입니다 . 책에서 위의 예가 아마 좋지 않은 것 같아 언제 사용합니까?


1
그게 무슨 책이야? 당신은 또한 예제가 좋지 않기 때문에
Michael K. Borregaard

"Learning Julia" ( 여기서 볼 수 있음) : epdf.pub/learning-julia.html (127 페이지)
Georgery

답변:


4

begin ... end블록 이 편리한 많은 상황이 있다고 생각 하지만, 언급 한 것처럼 함수와 같은 다른 구문에서도 비슷한 효과를 얻을 수 있습니다.

begin ... end블록 은 무엇을 위해 사용될 수 있습니까?

  • 단순히 변수와 이름을 "포함"하려면 len, breadthheight블록 내에 존재 단지와 주변 공간을 오염하지 않습니다.
  • 개별 문장이 아닌 코드 블록에 매크로를 적용합니다. 예를 들어 코드를 @inbounds begin <all my code without bounds checking goes here> end감싸는 것 @time begin ... end.
  • 주변 전역 범위에서 로컬 범위를 만들려면 ( 예 : 전역 범위 혼동 을 피하기 위해 ) (주석에서 지적했듯이 로컬 범위는 소개 begin ... end하지 않지만 인수는 유사한 let ... end블록에 적용됩니다.)

특히 두 번째 요점은 코드에서 사용하는 것입니다.


나는 또한 자신을 안심시켜야했지만 begin블록 은 범위를 소개 하지 않습니다 . 반면에, 일련의 명령문을 표현식으로 변환하면 매크로를 사용하거나 매크로로 코드를 생성 할 때 유용 할 수 있습니다.
phipsgabler

1
아, 고마워, 그 점에서 나는 let ... end로컬 범위를 소개하는 것과 혼동했다 . 내 대답을 바로 잡겠습니다.
crstnbr

나는 항상 같은 잘못된 가정을합니다 :) 그것은 단지 사람이 기대할 것입니다.
phipsgabler

1
@crstnbr 첫 번째 글 머리 기호는 여전히 잘못된 것입니다. 여전히 begin블록이 로컬 범위를 도입 한다고 말합니다 .
카메론 Bieganek

7

다른 사람들이 말한 것을 일반화하려면 : 블록을 사용하면 명령문 목록 (값이없는 (즉, 할당 할 수없는 구문 "구문" )을 하나의 표현식 (값을 나타내고 할당 할 수 있는 "구문")으로 변환 할 수 있습니다. ).

예를 들어,하지 말아야 할 동안

x = begin
    s = 0
    for i = 1:10
        s += i^2
    end
    s
end

x루핑 작업의 결과에 할당 합니다. (시퀀스의 마지막 명령문이 실제로는 표현식이어야한다는 제한 사항이 있습니다. 그렇지 않으면 표현식에 대한 값이 없습니다.)

이것의 합법적 인 사용 사례는 생성 된 코드입니다. 예를 들어

x = @somthing bla blub

으로

x = begin
   (stuff involving bla and blub)
end

투명 사용자의 상태는 @something자유롭게 언어 구조를 생성 할 수있다.

또는 더 긴 본문으로 익명 함수를 작성하고 function양식을 사용하지 않으려는 경우 :

f = x -> begin
   ...
end

1
약간의 설명 : Julia에서는 문장에 값 있으며 할당 할 수 있습니다. 당신이 할 수 있도록 x = y = 1, a = if false end그리고 b = for i in 1:2 end, 그 후에 x값을 가지고 1, 그리고 a그리고 b둘 다 값이 nothing.
카메론 Bieganek

아, 여기에 if-else문장 의 값을 할당하는 더 유용한 예가 있습니다 : a = if false; 1 else 2 end. 이 경우는 a같습니다 2.
Cameron Bieganek

1
맞습니다. 가치도 있고 기술적으로도 표현입니다. 대입은 기본적으로 setproperty!/ 이기 때문에 표현은 setindex!"전통적으로"가치가있는 것입니다 (C와 같은 언어로). if-else두 언어의 표현식 인와 동일 합니다. 그러나 forif없이 else의 "기본"값을 갖는 nothing, 나는 단지 유물로 그를 참조하십시오.
phipsgabler

6

이 블록들에 대한 한 가지 사용법은 다음과 같습니다.

A = [ begin
           x = y^2
           x - x^2 + 2
         end
         for y = 1:5 ]

대신 함수 내에서 함수를 만들어 사용할 수 있지만 때로는 편리합니다. 매크로에 인수로 전달하기 위해 여러 줄의 코드 블록을 사용하려고 할 때마다 사용됩니다 ( @testset테스트 표준 라이브러리에서 매우 일반적으로 사용됨 ).


당신의 요점을 반대하지 말고이 y^2 - y^4 + 2경우에 쓸 수 있습니다 . 아마도 두 개 이상의 단계가 실제로 필요한 예를 보여주는 것이 더 나을 것입니다.
crstnbr

@crstnbr 당신 말이 맞지만, 나는 처음에 책의 예제를 사용했고 합리적인 사용법이 무엇인지에 관심이있었습니다.
Georgery

1
마찬가지로 비싼 중간 값을 두 번 계산하는 것을 저장합니다.
phipsgabler

5

간단히 말해 :“begin”은 코드 블록을 나타냅니다 ( https://docs.julialang.org/en/v1/base/base/#begin 문서 참조 ).

위의 예제에서 begin 블록을 사용하는 것과 함수를 선언하는 것에는 어떤 가치가 있는지 명확하지 않습니다.

키워드에서 키워드가 많이 사용되는 것을 보지 못하고 실제로 개인적으로 사용한 적이 없습니다. 내 제안은 동일한 기능을 수행하는 것처럼 함수를 사용하는 것입니다.


아직 Julia를 사용하지는 않았지만 이것이 바로 내가 생각하는 것입니다. 그러나 언어가 설계되었을 때 (아마도 매우 똑똑한) 사람들은 생각을 가지고 있었을 것입니다.
Georgery

나는 많은 경우에 대신 함수를 사용하고 싶다는 @logankilpatrick에 동의합니다. 그러나이 블록이 존재하는 이유가 있다고 생각합니다 (내 답변 참조).
crstnbr

@Georgery 문장의 시퀀스를 표현식으로 바꾸는 것은 때때로 유용한 것입니다 ( prognLISP 참조 ).
phipsgabler

1
당신이 올바르게 알다시피, 그것은 문맥에서 무의미 해 보입니다
Michael K. Borregaard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.