문제

나는 Wikipedia를 확인하고 Googled를 검색했지만 여전히 Algol 60에서 패스별로 작동하는 방식에 대해 내 마음을 감쌀 수는 없습니다.

도움이 되었습니까?

해결책

나는 좋은 설명을 찾았다 패스 별 매개 변수 전달. 본질적으로, 함수의 본문은 실제 매개 변수를 함수 본문으로 텍스트로 대체 한 후 호출 시간에 해석됩니다. 이러한 의미에서 평가 방법은 C 전 처리기 매크로의 평가 방법과 유사합니다.

실제 매개 변수를 기능 본문으로 대체함으로써 함수 본체는 주어진 매개 변수를 읽고 쓸 수 있습니다. 이러한 의미에서 평가 방법은 통과 회의와 유사합니다. 차이점은 Pass-by Name이므로 매개 변수는 평가 함수 내부에는 다음과 같은 매개 변수가 있습니다 a[i] 현재 값에 따라 다릅니다 i 값을 참조하기보다는 함수 내부 a[i] 기능이 호출되기 전에.

위에서 링크 한 페이지에는 Pass-by-Name이 유용하고 위험한 위치에 대한 몇 가지 예가 있습니다. 패스별로 가능한 기술은 오늘날 패스 바로 회의 및 람다 기능과 같은 다른보다 안전한 기술에 의해 대체됩니다.

다른 팁

Algol 60에서 콜 별 이름을 의미한다고 가정합니다.

Cally-Name은 전달 된 매개 변수의 값을 변경할 수 있다는 점에서 콜 별 참조와 유사합니다. 매개 변수가 있다는 점에서 콜 별 참조와 다릅니다 ~ 아니다 절차가 호출되기 전에 평가되었지만 대신 게으르게 평가됩니다. 즉, 매개 변수가 실제로 사용될 때만 평가됩니다.

예를 들어, 절차가 있다고 가정합니다 f(x, y) 그리고 우리는 그것을 통과합니다 i 그리고 i/2 어디 i 처음에는 동일합니다 10. 만약에 f 세트 x 에게 42 그런 다음 평가합니다 y 그것은 가치를 볼 것입니다 21 (참조로 전화하거나 값으로 전화를 걸면 여전히 5). 이것은 표현 때문입니다 i/2 까지 평가되지 않습니다 y 평가됩니다.

여러면에서 이것은 매개 변수의 문자 그대로의 텍스트와 같이 행동하는 것처럼 보입니다 (이름 충돌을 피하기 위해 이름을 바꾸는 것). 그러나 실제로, 이것은 전달 된 표현식에 "Thunks"(기본적으로 폐쇄)를 사용하여 구현됩니다.

위키 백과 기사 Jensen의 장치 이름으로 전화를 사용하는 흥미로운 예를 보여줍니다. 여기에 그중 하나가 있습니다.

real procedure Sum(k, l, u, ak)
     value l, u;
     integer k, l, u;
     real ak;
     comment k and ak are passed by name;
 begin
     real s;
     s := 0;
     for k := l step 1 until u do
         s := s + ak;
     Sum := s
 end;

절차에서 인덱스 변수입니다 k 그리고 합산 용어 ak 이름으로 전달됩니다. 호출 이름으로 절차는 for 루프를 실행하는 동안 인덱스 변수의 값을 변경할 수 있습니다. 이름으로 전화를 걸어 ak 루프의 각 반복 중에 재평가 될 논쟁. 일반적으로, ak 변화 (측면 효과)에 의존합니다. k.

예를 들어, 실제 배열의 처음 100 항의 합을 계산하는 코드 V[] 다음과 같습니다.

Sum(i, 1, 100, V[i]).

미래의 사람들을 위해 :

John C. Mitchell의 프로그래밍 언어 개념도 도움이되었습니다.

패스 별. 아마도 Algol 60의 가장 이상한 특징은 회고 적으로 패스 별 사용 일 것입니다. 패스별로, 절차 호출의 결과는 공식 매개 변수가 절차 본문으로 대체 된 것과 동일합니다. 절차를 복사하고 공식 매개 변수를 대체하여 절차 호출 결과를 정의하기위한이 규칙을 Algol 60 Copy Rule이라고합니다. 사본 규칙은 Lambda 미적분학의 β 감소에 의해 설명 된 순수한 기능 프로그램에 적합하지만 공식 매개 변수에 대한 부작용과의 상호 작용은 약간 이상합니다. 다음은 Jensen의 장치라고하는 기술을 보여주는 예제 프로그램입니다. 표현식과 변수를 전달하여 절차에 포함 된 변수를 전달하여 프로 시저가 하나의 매개 변수를 사용하여 다른 매개 변수를 변경할 수 있습니다.


 begin integer i;
        integer procedure sum(i, j);
            integer i, j;
                comment parameters passed by name;
            begin integer sm; sm := 0;
                for i := 1 step 1 until 100 do sm := sm + j;
                sum := sm
            end;
        print(sum(i, i*10 ))
 end

이 프로그램에서 프로 시저 합계 (i, j)는 1에서 100으로 이동할 때 J의 값을 추가합니다. 코드를 보면 변경 사항이 변경되지 않으면 절차가 의미가 없음을 알게됩니다. J의 값; 그렇지 않으면 절차는 단지 100*j를 계산합니다. 여기에 표시된 호출 합계 (i, i*10)에서, 절차 본문의 루프는 1에서 100으로 이동함에 따라 i*10의 값을 추가합니다.

실제로, 콜마다 이름은 역사적 호기심이 아닙니다. Windows Batch 파일 (및 무수한 다른 스크립팅 언어)에서 Call-Name을 수행 할 수 있습니다. 작동 방식과 프로그래밍에서 효과적으로 사용하는 방법을 아는 것은 문제에 대한 깔끔한 솔루션을 열 수 있습니다. 나는 그것이 나중에 확장을 위해 줄을 통과한다는 것을 알고 있지만, 콜 별 이름과 유사한 효과를 갖도록 조작 할 수 있습니다.

call :assign x 1
exit /b
:assign
setlocal enabledelayedexpansion
(endlocal
:: Argument 1 is the name of the variable
set %1=%2
)
exit /b

Flatlander는 Scala에서 어떻게 작동하는지에 대한 조명 예를 가지고 있습니다. 여기. 구현하고 싶다고 가정 해 봅시다 동안:

def mywhile(condition: => Boolean)(body: => Unit): Unit =
  if (condition) {
    body
    mywhile(condition)(body)
  }

이것을 다음과 같이 부를 수 있습니다.

var i = 0
mywhile (i < 10) {
  println(i)
  i += 1
}

Scala는 Algol 60이 아니지만 약간의 빛을 흘릴 수 있습니다.

상징적 형태의 변수로 "이름"을 전달하여 동시에 업데이트 및 액세스 할 수 있습니다. 예를 들어 int 유형 인 변수 x를 트리플하려고합니다.

start double(x);
real x;
begin
x : = x * 3
end;

Algol은 수학 알고리즘을 위해 설계되었습니다. 나는 이름으로 전화의 예로서 요약 기능을 좋아합니다.

죄송합니다 내 algol은 약간 녹슬 었습니다. 구문은 아마도 옳지 않을 것입니다.

.FUNCTION SUM(var,from,to,function)
.BEGIN
  .REAL sum =0;
  .FOR var = from .TO to .DO sum = function;
  return sum;
.END

당신은 합계를 사용하는 것보다 할 수 있습니다

  Y = sum(x,1,4,sum(y,3,8,x+y));

위의 내부 합 (y, 3,8, x+y)은 이름없는 함수를 생성하여 외부 합 통화로 전달됩니다. 변수 x와 y는 가치별로 전달되지 않고 이름별로 전달됩니다. 변수의 경우 이름 별 호출 호출은 C에서 주소 참조로 호출하는 것과 같습니다. 재귀가 관련 될 때 약간 혼란스러워집니다.

제작 된 Algol 기계를 빌려줍니다. 그들은 3 개의 깃발 비트를 가진 48 비트 단어 메모리를 가졌습니다. 플래그 비트는 Algol이라는 이름으로 CAL을 구현했습니다. 스택 머신이므로 기능이 스택에로드되면 이름으로 호출이 호출되면 호출됩니다. 표현이 인수로 사용될 때 컴파일러는 이름없는 기능을 생성합니다. 변수는 간단한 간접 참조입니다. 오류가 함수에 쓰기가 발생합니다.

나는 클럽에 늦게 가입하고 있다는 것을 알고 있으며 이것이 반드시 답변 일 필요는 없지만 조금 명확히하는 데 도움이 될 수있는 한 가지를 추가하고 싶었습니다. 나는 항상 C ++ Preprocessor 지시문 (매크로)이 컴파일 시간 동안 실제 코드 조각으로 일부 함수/변수의 이름을 대체 할 때와 유사한 프로세스로 Algol 패스 별 이름을 생각했습니다. 패스 바로 이름은 기본적으로 공식 매개 변수의 이름을 실제 매개 변수로 대체하고 실행합니다. 나는 Algol에 글을 쓰지 않았지만, 패스 바로 이름이 C ++의 Pass-by-reepense와 동일한 결과를 얻을 것이라고 들었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top