리플레이션
Refal| 패러다임 | 패턴 매칭 및 용어 재작성 |
|---|---|
| 설계자 | 발렌틴 터친 |
| 개발자 | 발렌틴 터친, S. 플로렌체프, V.올류닌 외 |
| 첫 등장 | 1968 |
| 타이핑 규율 | 강하고 역동적인 |
| 웹사이트 | http://www.refal.net |
| 주요 구현 | |
| Refal-2, Refal-5, Refal-6, Refal+ | |
Refal("Recursive functions alographic language"; 러시아어: рRHRISTRIBASAR)은 "스트링 처리, 언어 번역, [및] 인공지능을 포함하여 "심볼 연산 지향의 기능 프로그래밍 언어"이다.[1]1966년 이론적 도구로 처음 착안된 이 가문에서 가장 오래된 구성원 중 하나로, 1968년 첫 시행이 나타났다.Refal은 크고 정교한 프로그램을 쓰기 위한 수학적 단순성과 실용성을 결합하기 위한 것이었다.
최초의 기능 프로그래밍 언어 중 하나로, 당시의 리스프와는 달리 Refal은 패턴 매칭에 기반을 두고 있다.그것의 패턴 매칭은 용어 다시 쓰기와 함께 작동한다.
Lisp와 Prolog의 기본 데이터 구조는 cons 조작에 의해 순차적으로 구축된 선형 목록으로, 따라서 리스트의 n번째 요소에 대한 O(n) 접근으로 구축된다.Refal의 목록은 양 끝에서 작성되고 스캔되며, 패턴 일치가 중첩된 목록뿐만 아니라 최상위 수준의 목록에서도 작동한다.사실상 Refal의 기본 데이터 구조는 리스트가 아닌 트리다.이는 패턴 매칭과 치환이라는 수학적으로 단순한 제어 메커니즘만을 사용하면서 데이터 구조를 만드는 데 자유와 편리함을 준다.
Refal은 효율적인 부분평가를 지원하기 위해 freezer라는 기능도 포함하고 있다.
Refal은 XSLT와 유사하게 트리 구조의 처리 및 변환에 적용될 수 있다.[2]
기본 사항
Refal Hello World의 예는 아래와 같다.
$ENTER 고 { = <헬로>;} 헬로 { = <헬로 월드>; } 위의 프로그램에는 Go와 Hello라는 두 가지 기능이 포함되어 있다.함수는 함수의 이름에 이어 함수의 본문을 곱슬브레이스로 표기한다.Go 기능은 $ENTER 명령을 사용하여 프로그램의 진입점으로 표시된다.
함수 본체의 표현은 Lisp 유사 구문에서의 함수 "calls"로 생각할 수 있다.예를 들어 Hello 함수는 'Hello world'라는 문자열을 인수로 하여 내장된 Prout 함수를 호출하는 것으로 나타난다.그러나 통화의 의미와 메커니즘은 사뭇 다르다.차이를 설명하려면 문자열이 구문인지 여부를 결정하는 다음 함수를 고려하십시오.
Pal { = True; s.1 = True; s.1 e.2 s.1 = <Pal e.2>; e.1 = False; } 이 예는 4문장(클라스터)으로 구성된 좀 더 복잡한 본체를 가진 기능을 보여준다.문장은 패턴 뒤에 등호 뒤에 오른손에 일반적인 표현이 뒤따르는 것으로 시작한다.문장은 세미콜론으로 종료된다.예를 들어 함수의 두 번째 문장의 패턴은 "s.1"이고 표현은 "True"이다.
이 예에서 알 수 있듯이 패턴에는 변수의 유형(변수와 일치하는 것)을 식별하는 문자의 형태를 가진 패턴 변수에 이어 변수 식별자가 포함된다."s"로 시작하는 변수는 단일 기호와 일치하고, "e"로 시작하는 변수는 임의의 표현과 일치한다.변수 식별자는 임의의 영숫자 시퀀스가 될 수 있으며 선택적으로 점으로 형식 식별자에서 분리된다.
함수는 첫 번째 패턴이 일치할 때까지 정의에 나타나는 순서에 따라 그 주장을 문장의 패턴과 비교함으로써 실행된다.그런 다음 함수는 논거를 일치된 문장의 오른쪽에 있는 표현으로 대체한다.
기능 어플리케이션의 결과가 각괄호 안에 하위표현을 포함하는 경우(우리 예시의 세 번째 문장이 적용된 후) 그 결과는 괄호 안에 있는 첫 번째 기호로 식별된 기능을 호출하여 Refal에 의해 추가로 처리된다.이러한 방식으로 확장할 각괄호가 결과에 더 이상 없을 때 실행이 중지된다.
따라서 Pal 함수는 다음과 같이 비공식적으로 읽을 수 있다: "표현이 비어 있으면 True로 대체한다.그렇지 않으면 식이 단일 기호인 경우 True로 대체하십시오.그렇지 않으면 표현식이 임의의 표현식 e.2 뒤에 같은 기호가 뒤따르는 기호라면, 그것을 <팔 e.2>라는 표현으로 대체한다.(다시 말해 시작과 끝에 동일한 두 개의 기호를 버리고 반복한다.그렇지 않으면 식을 False로 바꾸십시오(패턴 e.1은 항상 일치)."
다음은 다음 사항을 생성하기 위해 각 단계에서 적용된 문장 번호로 주석을 달은 3가지 단계별 실행 추적이다.
<팔 '아침' (#3) <팔 'oo'> (#3) <팔> (#1) 진실
<팔 '와우' (#3) <팔 '오' (#2) 진실
<팔 '리볼버'> (#3) <팔 '이발브' (#3) <팔 '볼브' (#3) <팔 '올' (#4) 거짓
이제 우리는 헬로 월드 예제가 실제로 다음과 같은 표현 변환의 시퀀스로 실행된다는 것을 알 수 있다.
$ENTER로 표시된 초기 표현으로 기계를 시드한다: <Go > (Go에서 문장을 적용) <Hello> (Hello에서 문장을 적용) <Prout 'Hello world> (Prout은 인쇄하여 무로 확장하는 내장형) (적용할 것 없음; 정지)
기타 예
요인
사실 { 0 = 1; s.N = <* s.N < 팩트 <- s.N 1>; } 여기서 0은 0과 일치하고 1을 생성한다.숫자인 다른 기호에 (Fact(-s.N 1)의 결과와 곱하십시오. 연산자의 접두사 스타일을 참고하십시오.
루프가 있는 요인
팩트 {s.n = <루프 s.n 1>, }; 루프 { 0s.f = s.f; s.n s.f = <루프 <- s.n 1> <* s.n.f>; } s.n이 루프 카운터 역할을 하는 것을 알 수 있다.
평등
등가 { (e.1)(e.1) = T; (e.1)(e.2) = F; } 여기서 함수는 두 개의 항이 주어진 경우로 정의되며, 용어가 같을 경우 첫 번째 조항이 일치하여 True를 생성한다.그렇지 않으면 두 번째 절이 일치하여 False를 생성한다.
Refal의 중요한 속성은 refal의 모든 기능이 단일 인수라는 것이다. (그러나 위에서와 같은 표현으로 분해될 수 있다.
만약
제어 구조 정의가 용이함
{T 그렇다면 (e.1) 기타 (e.2) = e.1, F (e.1) 기타 (e.2) = e.2; } 여기서 e1은 입력된 식이 'True'와 일치하는 경우에만 평가된다. 그렇지 않으면 e1 e2는 e2에 대해 동일하다.
스퀴즈 블랭크
{ e.1'__'e.2 = <Squeeze e.1'_'e.2>; e.1 = e.1; } (함수 호출을 명확히 하기 위해 스페이스 문자 대신 '_'를 사용한다.)첫 번째 절은 스퀴즈 함수가 입력 표현식에서 이중 공백과 마주칠 때마다 일치하며, 이를 하나의 공백으로 대체한다.두 번째 절은 첫 번째 절이 일치하지 않을 때만 일치하며, 현재 표현식인 결과 값을 반환한다.
명시적 루핑을 사용하여 압착
{ '__'e.1 = <Squeeze '__e>e.1>; s.A e.1 = s.A <Squeeze e.1>; = ; };
참조
- Turchin, Valentin F. (1989). "REFAL-5 Programming Guide and Reference Manual". The City College of New York, New England Publishing Co., Holyoke.
- ^ Turchin, Valentin F. (1989). "Introduction to Refal". REFAL-5 programming guide & reference manual. Holyoke: New England Publishing Co. Archived from the original on 2008-07-03. Retrieved 2010-04-05.
- ^ "Archived copy". Archived from the original on 2007-12-06. Retrieved 2008-03-18.
{{cite web}}: CS1 maint: 타이틀로 보관된 사본(링크)