함수 이름에 할당하여 반환 값을 설정하는 언어는 무엇입니까?

Jan 18 2021

이 스택 오버플로 질문 에서 원래 코드는 함수 이름을 변수로 사용하는 실수를 저질렀 고 반환 값을 할당했습니다. 한 댓글 작성자는 한때 함수에서 값을 반환하는 방식 인 언어를 사용했다고 언급했습니다. 코멘트에는 "한때 함수의 반환 값을 함수 이름에 할당해야하는 언어를 사용했음을 알고 있습니다. 너무 오래되고 구식이어서 어떤 언어 였는지조차 기억할 수 없습니다."

저에게도 익숙한 것 같지만 어떤 언어 였는지 기억이 나지 않습니다.

우리보다 기억력이 좋은 사람이 있고 어떤 언어인지 말할 수 있습니까?

답변

50 WillHartung Jan 18 2021 at 22:45

파스칼은 이것을합니다. 저는 다른 사람들을 모릅니다. 연습이 다른 Wirth 언어로 진행되는지 여부는 알 수 없습니다.

50 OmarL Jan 18 2021 at 23:14

Visual Basic 제품군의 언어는 정확히이 작업을 수행합니다. 여기에는 VBScript, VBA, Visual Basic 및 이전 버전이 포함됩니다. 나는 이것들이 QBASIC의 "기능"을 상속한다고 믿습니다. 예를 들면

Public Function AddTwo(something as Integer)
    AddTwo = something + 2
End Function
29 scruss Jan 18 2021 at 23:03

Fortran, 확실히 :

      PROGRAM TRIANG 
      WRITE(UNIT=*,FMT=*)'Enter lengths of three sides:' 
      READ(UNIT=*,FMT=*) SIDEA, SIDEB, SIDEC 
      WRITE(UNIT=*,FMT=*)'Area is ', AREA3(SIDEA,SIDEB,SIDEC) 
      END 

      FUNCTION AREA3(A, B, C) 
*Computes the area of a triangle from lengths of sides 
      S = (A + B + C)/2.0 
      AREA3 = SQRT(S * (S-A) * (S-B) * (S-C)) 
      END

(Clive G. Page의 전문 프로그래머 가이드에서 Fortran77까지 ).

Fortran ANSI X 3.9 1966 Fortran 66 표준 에서도 그렇게 정의되었습니다 .

22 user3840170 Jan 18 2021 at 23:54

내가 찾을 수있는 가장 빠른 언어는 FORTRAN II와 ALGOL 58이며 둘 다 1958 년에 출판되었습니다. 원래 FORTRAN (1956)도 포함될 수 있습니다.

FORTRAN의 경우 기능을 다루는 매뉴얼 장의 첫 페이지에 다음 예제가 포함되어 있습니다 (27 페이지).

FUNCTION AVRG (ALIST, N)
DIMENSION ALIST (500)
SUM = ALIST (1)
DO 10 I=2, N
SUM = SUM + ALIST (I)
AVRG = SUM / FLOATF (N)
RETURN
END (2, 2, 2, 2, 2)

FORTRAN II에는 또한 이전 함수에서 상속 된 단일 행 함수 정의 인 다른 함수 구문 (10 페이지)이 포함되어 있습니다.

FIRSTF(X) = A*X + B

전자 구문이 어떻게 후자의 자연스러운 확장인지, 수학적 사용에서 비롯되는지 확인하는 것은 어렵지 않습니다.

ALGOL 58 은 FORTRAN과 유사하게 두 단일 행 '함수'를 정의합니다.

함수 선언은 주어진 식을 특정 변수 의 함수로 선언합니다. 따라서 선언은 이 함수가 표현식에 나타날 때마다 함수 (cf. functions )에 값을 할당하기위한 계산 규칙을 ​​제공합니다 (특정 단순 함수의 경우) .

형식 : Δ ~ I n (I, I, ~, I) : = E 여기서 I는 식별자이고 E는 구성 요소 중 괄호 안에 나타나는 식별자로 명명 된 간단한 변수를 포함 할 수있는 표현식입니다.

그리고 '절차'는 오늘날의 함수 정의에 해당합니다 (적어도 명령형 / 절차 적 프로그래밍 언어에서). 반환 값은 다음과 같이 표시됩니다 (19 페이지).

표제에 나열된 각 단일 출력 프로 시저 I (P i )에 대해 할당 문 "I : = E"에 의해 프로 시저 내에서 값을 할당해야합니다. 여기서 I는 해당 프로 시저 이름을 지정하는 식별자입니다.

이러한 구문은 나중에 BASIC ( DEF FN및 이후 형식 FUNCTION) 및 ALGOL의 후손 Pascal의 일부 방언에 의해 채택 되었습니다 .Borland의 Pascal 컴파일러에서 함수 이름에 할당하는 것은 ResultDelphi 1.0 에서 변수가 도입되기 전에 지원되는 유일한 구문이었습니다 .

언급 된 주석가가 기억 한 것은 아마도 Pascal 일 것입니다. 일부 대학은 여전히 ​​프로그래밍을 가르치고 있으며 일반적으로 Object Pascal과 같은 현대적인 확장 방언 대신 원래의 표준 다양성을 고수합니다. (이것은 실제로 질문의 일부는 아니지만 StackOverflow 질문자의 오해도 그것에서 비롯되었다고 가정합니다.)

17 Raffzahn Jan 19 2021 at 00:28

TL; DR :

아마도 당신이 기억하는 것은 PASCAL이 아마도 80 년대 초반에 꽤 인기가 있었기 때문에 80 년대를 거쳐 90 년대까지 대학 과정에서 사용되었으며 그 이후에도 여전히 약간의 교제를 가졌기 때문에 가장 주목할만한 Delphi입니다.


일부 역사

기본 아이디어는 함수 이름이 이미 예약되어있을뿐만 아니라 다른 것을 생각 해낼 필요가 없으며이를 사용하면 이것이 결과라는 명확한 진술이라는 것입니다. 또한 전용 데이터 항목을 호출 규칙 내에서 할당 할 수 있으므로 컴파일러 설계를 단순화합니다.

기본적으로 FORTRAN과 ALGOL의 두 가지 유산이 있습니다.

그들의 후손 중 일부는 그것을 유지했습니다.

  • FORTRAN의 일부 BASIC 변형 및
  • ALGOL의 Pascal 및 Modula.

다른 사람들은 ALGOL 후속 조치처럼 그것을 떨어 뜨 렸습니다.

  • return()구문 을 도입 한 BCPL은

C가 BCPL에서 가져 왔기 때문에 오늘날 매우 일반적입니다.

언어 아이디어는 숙주 사이를 뛰어 다니는 유전자와 같습니다. 예를 들어, ADA, 여러면에서 ALGOL / PASCAL 손자도 return요소 를 사용하는 것으로 전환했습니다 .

Granddaddy FORTRAN은 수년 동안 함수 결과를 반환하는 방식을 다양하게 해왔습니다.

  • 원래 함수의 결과는 함수의 식별자에 할당되었습니다.
  • FORTRAN 90에서는 함수 헤드의 반환 이름에 대한 명시 적 정의가 도입되었습니다.

이것은 본질적으로 구문상의 설탕이지만 스타일의 변화가 특징입니다. 적용된 이유는 재귀 구조 Foo = Foo(x-1)가 이상하게 보일 것이라는 것입니다. 그러나 그것은 해석에 달려 있다고 생각합니다.

흥미롭게도 1958 년의 FORTRAN II는 RETURN절차 적 프로그래밍을 추가하려는 노력에서 명령문을 도입 했지만 사용은 단순히 호출자에게 실행을 반환하는 것이었고 반환 값은 별도로 설정해야했습니다.

12 alephzero Jan 18 2021 at 23:02

Fortran은 Fortran 2008 이상에 이르기까지 모든 기능을 갖춘 초기 버전에서이 구문을 사용했습니다.

그러나 Fortran 2008에는 함수 값을 반환하는 데 사용되는 다른 변수 이름을 선언 할 수있는 옵션이 있습니다. 예를 들면

function xyz(argument) result(answer)
...
answer = 42
...
end function xyz

예전 스타일 대신

...
xyz = 42
...
9 another-dave Jan 19 2021 at 01:02

1 인용 Algol 60.

다음 은 알고리즘 언어 알고리즘에 대한 개정 된 보고서 60 의 관련 단어입니다 .

5.4.4. 기능 지정자의 값.

프로 시저 선언이 함수 지정자의 값을 정의하려면 프로 시저 선언 본문 내에서 왼쪽 부분에 프로 시저 식별자가있는 하나 이상의 명시 적 할당 문이 있어야합니다. 이들 중 적어도 하나가 실행되어야하며, 프로 시저 식별자와 연관된 유형은 프로 시저 선언의 맨 처음 기호로 유형 선언자의 출현을 통해 선언되어야합니다. 이렇게 할당 된 마지막 값은 함수 지정자가 발생하는 표현식의 평가를 계속하는 데 사용됩니다.

할당 문의 왼쪽 부분이 아닌 프로 시저 본문 내에서 프로 시저 식별자가 있으면 프로 시저의 활성화를 나타냅니다.

마지막 문장은 중요합니다. 이것은 프로 시저 (함수) 유형의 이름이 프로 시저 (함수) 본문 내에서 변수와 '마찬가지로'취급되지 않음을 보여줍니다. 오히려 특수한 경우에만 할당됩니다.

알골 60에서, 인수를 취하지 않는 함수를 호출은 빈 괄호 뒤에되지 않습니다 따라서 n := read가 아니라 n := read().

마지막 문장은 인 것으로 유명 문장 언어로 재귀 절차를 얻었다. 그러나 그것은이 답변과 관련이 없습니다.

6 StephenKitt Jan 18 2021 at 23:03

BASIC은 반환 ​​값을 제공하기 위해 일부 방언이 함수 이름에 할당 된 함수가있는 또 다른 언어입니다. 초기 방언은 Fortran 단일 행 기능과 유사했습니다.

DEF FND(x) = x*x

그러나 이후의 방언은 Fortran 다중 라인 기능 과 유사한 더 복잡한 변형을 허용했습니다 .

DEF FNPeekWord& (A&)
  FNPeekWord& = PEEK(A&) + 256& * PEEK(A& + 1)
END DEF
5 LyndonWhite Jan 19 2021 at 20:38

MATLAB / Octave도이 작업을 수행합니다.

1984 년부터입니다. 다른 사람들만큼 오래되지 않았습니다.

원래 높은 수준의 도구로 인식 되었기 때문에 Fortran을 모방했을 것입니다. Linpack 및 Eispack과 같은 Fortran 라이브러리 위에 있습니다.

5 chasly-supportsMonica Jan 19 2021 at 21:29

나는 SNOBOL4가 이것을했다고 믿습니다. http://berstis.com/greenbook.pdf

다음은 숫자의 계승을 계산하는 함수의 정의 및 사용 예입니다.

   DEFINE('FACT(N)') :(SKIPFCN)
 * Set value to 1
 FACT      FACT = 1
 * Return 1 if N<2
 * Return N*((N-1)!) with recursive call
   FACT = GT(N,1) FACT(N - 1) * N :(RETURN)
 SKIPFCN
   OUTPUT = '5 factorial is ' FACT(5)

http://berstis.com/s4ref/prim3e.htm

4 d3jones Jan 19 2021 at 07:12

Verilog (1995/2001)도 암시 적 변수에 할당하여 반환합니다. SystemVerilog는 "return"문을 추가했지만 클래식 할당은 계속 사용할 수 있습니다.

1 arne Jan 21 2021 at 03:02

Haskell (1990 년부터)도 다음과 같이합니다.

doubleMe x = x + x  

doubleMe하나의 매개 변수 의 함수 를 정의하고 여기 x에 함수 본문 x+x을 할당합니다. Great You A Haskell For Great Good을 참조하세요.

mathrick Jan 19 2021 at 13:08

Pascal은 제가 개인적으로 사용했던 것입니다. Common Lisp는 반환 값이 거의 항상 암시 적이라는 점에서 약간의 작업을 수행합니다 (즉, 모든 문에는 값이 있고 블록의 마지막 값은 블록의 반환 값입니다). 따라서 거의 볼 수 없습니다. 명시 적 return 문이지만 값을 반환해야하고 암시 적 방법을 사용할 수없는 경우 다음 과 같이 RETURN-FROM[*] 문 을 사용하는 방법이 (return-from function-name value)있습니다..

[*]RETURN 명령문 도 있지만,의 약칭이며 실행 된 함수의 값을 만드는 효과 (return-from nil value)없습니다VALUE . C와 그 후손에서 온 초보자에게는 큰 함정입니다.