let
-forms은 내부에 여러 가지 표현을 포함 할 수 있습니다.let-forms는 어떻게 평가됩니까?</p> <pre><code>(let ((x 4)) x (+ x 1)) </code></pre> <p>반환 <code>5</code> :
이 표현식은 어떻게 평가됩니까? 성경에 기록 된 것처럼 코드가 평가 즉 암시 begin
를 불렀다
let
-forms은 내부에 여러 가지 표현을 포함 할 수 있습니다.let-forms는 어떻게 평가됩니까?</p> <pre><code>(let ((x 4)) x (+ x 1)) </code></pre> <p>반환 <code>5</code> :
이 표현식은 어떻게 평가됩니까? 성경에 기록 된 것처럼 코드가 평가 즉 암시 begin
를 불렀다
. 다음으로 ... let
식 lambda
식 파라미터의리스트 후
cond
표현식의 각 절 이후... 표현식 목록을 쓸 수 있습니다. 암시 적으로 해당 표현식은 begin
특수 형식으로 묶여 있으며 평가 순서는 왼쪽에서 오른쪽으로, 모든 표현식이 순서대로 평가되지만 반환되는 값은 마지막 표현식의 값입니다. 예를 들어
,이 식 :
(cond ((= 1 1) 1 2 3))
은 동일합니다 : 그 목록의 마지막 식의 값이기 때문에 두 경우 모두
(cond ((= 1 1) (begin 1 2 3)))
는 반환 값은, 3
입니다.
:
당신이 설명하고 상황이let
표현에뿐만 아니라, 계획의 여러 부분에서 발생
(let ((x 4)) (begin x (+ x 1)))
글쎄, 용어를 분명히 알기로하자. 바인딩 및체 :하십시오 let
형태는 두 부분 갖는다
(let (<zero or more bindings>)
<one or more body expressions>)
바인딩 폼 (<variable> <expression>)
를 갖고, 상기 본체는 식의 서열이다. A let
은 다음과 같이 평가됩니다.
용어 - 변수 바인딩 이후의 표현식은 집합 적으로 본문으로 알려져 있으며 본문의 각 식은 본문 식입니다.예는 :
(let ((variable-1 value-1)
(variable-2 value-2))
body-expression-1
body-expression-2)
표현 begin
에 싸여 몸 - (let ((x 2)) x (+ x 1))
은 (let ((x 2)) (begin x (+ x 1)))
과 동일합니다.
begin
의 각 본문식이 계산되고 최종 식의 반환 값이 전체 본문에 대한 반환 값으로 사용됩니다. 예 : (begin (+ x 1) (+ x 2))
은 (+ x 1)
과 (+ x 2)
을 평가 한 다음 (+ x 2)
의 결과를 반환합니다.
begin
의 모든 본문에 부작용이 없으면 프로그램의 런타임 동작을 변경하지 않고 마지막 본문 표현식을 제외하고 모두 제거 할 수 있습니다. 여기서 유일한 예외는 예비 본문 표현식 중 하나가 느리게 실행되거나 반환되지 않거나 오류가 발생하지 않는 경우입니다. 본문 표현식을 제거하면 프로그램의 런타임 동작이 변경되므로 문제가 해결됩니다.
그러나 부작용이있는 함수를 사용할 때 부작용에 대해 하나 이상의 함수를 호출 한 다음 값을 반환하는 기능이 유용합니다.
http://groups.csail.mit.edu/mac/ftpdir/scheme-7.5/7.5.17/doc-html/scheme_3.html#SEC39 –