· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Concatenative Programming Language

대충 어디쯤의 위상


  • 혹은 StackBasedProgrammingLanguage라고도함.
  • ObjectOrientedProgrammingLanguage, FunctionalProgrammingLanguage와 같은 ProgrammingParadigm의 하나.

ApplicativeProgrammingLanguage? ConcatenativeProgrammingLanguage?


  • ApplicativeProgrammingLanguage? 일반적으로 우리가 흔히 알고있는 함수에 인자를 적용하는 언어.
  • ConcatenativeProgrammingLanguage? 하나의 객체에 대해 여러 함수의 조합이 값을 누적/전달하는 언어
    • 하나의 객체는 보통 Stack.
    • ApplicativeProgrammingLanguage에서 각 함수는 서로 문맥간의 조합을 만들어줘야했음에 반해, ConcatenativeProgrammingLanguage은 자연스럽게 흘러간다.
    • ForthLanguage, CatLanguage, JoyLanguage, PostScript, Pdf(PostScript의 subset을 포함), FactorLanguage등이 여기에 속함.

python, java가 applicative인 것은 좀 이상하군요. imperative(w/ OO) 쯤 인것으로 압니다만... - mwPark

''imperative <-> functional인것처럼. imperative와 object-oriented가 함께 있을수있듯이. 예를들어, haskell은 functional + applicative겠죠. 또 명백히 concatenative인 FactorLanguage의 경우 말씀하신 imperative, +object-oriented이기도 하구요. 그것들이 같은 수직선상에 있어서 어떤지점이 딱 하나의 패러다임만 쫒지는 않는다는걸 잘 아시는듯한데요? (언급하셨듯이 파이썬, 자바는 축이 2개인 공간에 있겠죠. 위치는 imperative, object-oriented. 그리고 그 2차원의 축에 concatenative, applicative을 추가하는게 아니라 새로운 축이 있다고 생각하시는게 맞지않을까싶네요.) applicative, concatenative가 functional, object-oriented, imperative등과 같은 paradigm이지만, 같은 위상에 위치한게 아니라고밖엔 설명을 못드리겠네요. http://concatenative.org/wiki/view/Concatenative language <- 여기를 참고해주시길. - ageldama''


''사족을 더해보면 applicative language에서 x에 대해서 함수 A, B, C, D을 적용하는 예는 다음과 같다고 하더군요. (D (C (B (A x)))) 혹은 D(C(B(A(x)))). 이에 반해서 concatenative language에서는 x A B C D와 같이 표현합니다. (아무리 생각해도 자바, 파이썬은 전자인것 같은데요^^;). 정확한지는 확신이 없지만, unix-shell과 같이 pipe을 이용해 하나의 자료흐름에 대해서 여러 연산을 적용하는예도 concatenative의 한예가 아닐까 싶습니다. find /etc -name "*.bak" | sort | uniq | wc -l -ageldama''


맛보기


현대적인 FactorLanguage을 기준으로 예를 몇가지 들어보겠음.


"Hello, World!"

! 1) "Hello, World!" 문자열을 스택에 넣어놓고
! 2) 스택에서 하나를 꺼내 화면에 출력하는 print '워드'를 평가
"Hello, World!" print


간단한 Factor에서 REPL세션

(이하의 ( scratchpad )은 프롬프트, !으로 시작하는 행은 주석.)
! 스택에 2를 넣어요.
( scratchpad ) 2
--- Data stack:
2

! 스택에 3을 넣어요.
( scratchpad ) 3
--- Data stack:
2
3

! 스택의 두값을 더해서 결과를 스택에 쌓아요.
( scratchpad ) +
--- Data stack:
5

! 스택의 값의 제곱을 구해요.
( scratchpad ) sq
--- Data stack:
25

! 스택의 맨 마지막값을 꺼내서 보여줘요.
( scratchpad ) .
25

! 지금까지 사용한, +, sq, . 함수의 정의를 살펴보기
( scratchpad ) \ + see
IN: math
MATH: + ( x y -- z ) foldable flushable

( scratchpad ) \ sq see
USING: kernel ;
IN: math
: sq ( x -- y ) dup * ; inline

( scratchpad ) \ . see
USING: io ;
IN: prettyprint
: . ( obj -- ) pprint nl ;

! (2+3)**2을 구해서 화면에 출력해요. (지금까지를 한줄로.)
( scratchpad ) 2 3 + sq .
25

  • 스택에 값을 넣고 쌓는 형태
  • 스택에 누적한 값에 연산을 적용하기.
    • 예를 들어, +함수의 StackEffectDeclaration은 ( x y -- z )이므로, 스택에서 두값을 취해서(스택에서 꺼내서) 결과를 다시 스택에 넣습니다.
    • sq함수은 ( x -- y )이므로, 스택에서 하나를 꺼내, 그 값의 제곱을 스택에 다시 넣습니다.
  • \ +와 같이 \워드을 이용해서 함수 자체를 값으로 취급할수있습니다.
  • 여러행에 걸쳐서 스택에 영향을 주고, 그에 대해서 연산을 하듯이, 연합하여 결과를 얻을수도 있습니다.






관련정보





sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-02-19 16:38:00
Processing time 0.0060 sec