블록 스크립트-535
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;
BlockScript는 이 도전을 위해 특별히 만든 간단한 스파게티 스택 기반 언어입니다. 기본 인터프리터는 blockscript.c 입니다.
샘플 프로그램 (처음 15 피보나치 수를 인쇄) :
{[B?B10/A!B10%d&:0}
{[B0<?'-.0B-A!:{B?Bh!{[B?B[A]A!B[B]'0+.:}!:'0.}!10.}
{[B?Dd!DC+B1-CecA!:}
0 1 15d!
;
인터프리터는 표준 입력에서 소스 코드와 프로그램 입력을 순서대로 읽습니다. 즉, 인터프리터 내에서 인터프리터 내에서 인터프리터를 실행하려면 간단히 복사하여 붙여 넣습니다.
# Level 1
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;
# Level 2
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;
# Level 3
{[B?B10/A!B10%d&:0}
{[B0<?'-.0B-A!:{B?Bh!{[B?B[A]A!B[B]'0+.:}!:'0.}!10.}
{[B?Dd!DC+B1-CecA!:}
0 1 15d!
;
영화의 시작 과 마찬가지로 , 당신은 거의 세 단계보다 더 깊이 갈 수 없습니다. 시간 문제가 아니라 공간 문제입니다. BlockScript는 메모리를 풍부하게 누출하며 이는 언어 자체의 설계 방식과 관련이 있습니다.
언어 참조 :
통역사를 여기로
BlockScript에서 "스택"은 익숙한 후속 작업으로 덮어 쓰는 배열이 아닙니다. 실제로 변경 불가능한 연결 목록으로 구현되며 프로그램 기간 동안 스택이 유지됩니다. 또한 연산자 (제외 @
)는 스택에서 값을 제거 하지 않습니다 . 그러나 스택 수정은 발생하는 블록에만 영향을줍니다.
값 선택
a
...을 통하여 z
스택에서 0-25 번째 항목을 가져 와서 스택으로 밉니다. a
스택의 헤드 또는 가장 최근에 밀린 항목을 나타냅니다.
A
...을 통하여 Z
현재 프레임의 0-25 번째 항목을 가져 와서 스택으로 밉니다.
[
"프레임"을 열어 스택 헤드의 스택 참조 (아래 참조)에서 항목을 선택하십시오. [
일치하지 않아도 ]
되지만 프레임 범위는 어휘 범위입니다. BlockScript에서 "scope"는 블록을 형성 하는 중괄호 ( {
... }
)로 결정됩니다 . 따라서 블록 내부에서 프레임을 여는 것은 블록 외부의 코드에 영향을 미치지 않습니다.
]
현재 프레임을 닫고 이전 프레임 (있는 경우)으로 돌아갑니다.
블록
{
... }
"블록"을 만들고 스택으로 밀어 넣습니다. 블록 안에서는 스택이 블록 앞의 위치에서 시작합니다. 단, 호출자의 스택은 맨 위로 밀립니다. 스택은 BlockScript에서 영구적이며 불변이므로 블록은 클로저입니다. 관용구 {[
는 블록을 연 다음 프레임을 열어 인수 선택을 시작합니다 (를 A
통해 사용 Z
). 블록의 반환 값 }
은 도달 했을 때 스택의 헤드입니다 .
예:
'3 '2 '1 {[ b. d. f. B. C. D. A! } 'D 'C 'B d!;
이 인쇄 123BCD123DCB123BCD123DCB…
됩니다. 소문자는 스택 값을 나타내며 대문자는 인수를 나타냅니다 (프레임이 호출자의 스택으로 설정 되었기 때문에). A!
호출자의 머리를 잡고 (호출되는 블록으로 보장됨) 호출합니다. 왜 BCD
매번 B. C. D.
역순으로 바뀌는 지 궁금하다면 블록이 호출되기 직전에 해당 인수를 역순으로 푸시 하기 때문 입니다.
!
블록을 호출하십시오. 반환 값을 스택으로 밉니다.
스택 레퍼런스
&
스택 참조를 작성하여 스택으로 밉니다. 스택의 모든 항목을 효과적으로 가져 와서 "튜플"을 형성하므로이를 "초과 단점"이라고 생각하십시오. 관용구의 &[
것을 어떤 수단 a
, b
, c
라고는 이전에 지금 액세스 할 수 있습니다하는 A
, B
, C
(블록의 나머지 나까지 ]
발생).
&
BlockScript는 일반적으로 필요한 것보다 많은 값을 캡처 하기 때문에 의도적으로 메모리가 누수됩니다.
@
스택 참조가 가리키는 스택으로 전환합니다 a
. 이 연산자는 다소 이상하지만 BlockScript 자체 통역사는이 인수를 두 번 사용하여 동일한 인수를 두 번 푸시하지 않아도됩니다. 그 문제에 대한 영향 @
(또는 그 문제에 대한 스택 작업)은 그것이 호출되는 블록으로 제한됩니다. 또한 프레임은의 영향을받지 않으므로 @
스택을 전환 한 후 필요한 값을 가져 오는 데 프레임을 사용할 수 있습니다.
조건식
I / O
참고 : 입력 및 출력은 UTF-8로 수행됩니다. "문자"는 유니 코드 인덱스에 해당하는 정수입니다.
정수 / 문자 리터럴
참고 : 정수 및 문자는 BlockScript에서 동일합니다.
'c
문자 c를 누릅니다.
[0-9] +
십진 정수를 누릅니다.
산수
이 연산자는 정수 값에서만 작동합니다.
+
계산 b
+ a
(결과를 푸시하지만 값을 버리지 않음)
-
계산 b
- a
.
*
계산 b
* a
.
/
계산 b
/ a
(정수 나누기; 음의 무한대로 반올림).
%
계산 b
% a
(정수 계수, 음의 무한대로 반올림).
관계 연산자
이 연산자는 정수 값에서만 작동합니다.
<
경우 b
미만이다 a
푸시 1, 다른 푸시 0.
>
=
여러 가지 잡다한
#
줄의 끝까지 주석
- 이 프로그램은
;
- 다른 모든 문자는 무시됩니다.
/usr/bin/cat
-완전성은 어떻습니까?