미란다(프로그래밍 언어)

Miranda (programming language)
미란다
Miranda logo (programming language).jpg
패러다임게으름, 기능, 선언적
설계자데이비드 터너
개발자리서치 소프트웨어
처음 등장한1985년(1985년)
타이핑 분야강력, 정적
웹 사이트miranda.org.uk
주요 구현
미란다
영향을 받다
KRC, ML, SASL, Hope
영향받은
클린, Haskell, Orwell, Microsoft Power Fx

미란다는 David TurnerML과 Hope의 개념을 사용하여 초기 프로그래밍 언어인 SASL과 KRC의 후속으로 설계한 게으른 순수 기능 프로그래밍 언어입니다.이는 [1]영국의 Research Software Ltd(미란다라는 이름에 상표권이 있음)에 의해 제작되었으며 상업적으로 [citation needed]지원되는 최초의 순수 기능 언어였다.

미란다는 1985년 Unix-flavour 운영 체제용 C의 빠른 인터프리터로 처음 출시되었으며 1987년과 1989년에 후속 출시되었습니다.그것은 이후의 하스켈 프로그래밍 [2]언어에 강한 영향을 끼쳤다.

2020년에 미란다 버전은 BSD 라이선스에 따라 오픈 소스로 출시되었습니다.코드베이스는 최신 C 표준(C11/C18)에 준거하여 64비트 바이너리를 생성하도록 업데이트되었습니다.이것은, Debian, Ubuntu, WSL/Ubuntu, MacOS(Catalina)[3][4]의 operating system에서 테스트되고 있습니다.

개요

미란다는 게으르고 순전히 기능적인 프로그래밍 언어이다., 부작용과 필수 프로그래밍 기능이 결여되어 있습니다.미란다 프로그램(스크립트라고 함)은 다양한 수학 함수와 대수 데이터 유형을 정의하는 방정식의 집합입니다.여기서 단어 집합은 중요합니다.일반적으로 방정식의 순서는 무관하며 사용하기 전에 엔티티를 정의할 필요가 없습니다.

해석 알고리즘은 레이아웃(인디케이션)을 인텔리전트하게 사용하기 때문에 문을 괄호로 묶을 필요가 거의 없으며 문 종료자도 필요하지 않습니다.ISWIM에서 영감을 받은 이 기능은 OccamHaskell에서도 사용되며 나중에 Python에 의해 대중화되었습니다.

캐릭터에 의해 코멘트가 일반 스크립트에 도입된다. 그리고 같은 줄의 끝까지 이어집니다.대체 코멘트 규칙은 "리터레이트 스크립트"로 알려진 소스 코드 파일 전체에 영향을 줍니다.여기서 모든 행은 코멘트라고 간주됩니다.>서명하다.

미란다의 기본 데이터 유형은 다음과 같습니다.char,num그리고.bool.문자열은 단순히 다음 목록입니다.char,하는 동안에num는 2개의 기본 형식(기본적으로는 임의의 정수(일명 bignums)와 필요에 따라 일반 부동소수점 값) 사이에서 사일런트 변환됩니다.

튜플은 파스칼과 유사한 언어의 레코드와 유사한 혼합 유형의 요소 시퀀스로 다음과 같이 괄호로 구분하여 작성됩니다.

  this_discriptions(이_discriptions) = ("미행자, 메리", 10560, 거짓의, 35) 

대신 목록은 미란다에서 가장 일반적으로 사용되는 데이터 구조입니다.각 괄호 및 쉼표로 구분된 요소로 구분되며, 모든 요소가 동일한 유형이어야 합니다.

  week_days = ['월','화',"수요일",'목','금요일'] 

목록 연결은++, 뺄셈은--, 시공은:사이징은#인덱싱은!, 그래서:

  날들 = week_days ++ ['토','태양']   날들 = 'NIL':날들   날들!0   'NIL'   날들 = 날들 -- ['NIL']   #날들   7 

목록 작성 단축키는 다음과 같습니다...는 요소가 산술 시리즈를 형성하는 목록에 사용되며, 1 이외의 증분을 지정할 수 있습니다.

   n   = 제품. [1..n]   홀수합 =  [1,3..100] 

보다 일반적이고 강력한 목록 작성 기능은 "목록 통합"(이전의 "ZF 표현식")에 의해 제공되며, 이는 다음과 같은 두 가지 주요 형식으로 제공됩니다.

  정사각형 = [ n * n   n <-> [1..] ] 

(읽기: 모든 양의 정수 목록에서 n을 뺀 n 제곱 목록) 및 각 항이 이전 항의 함수인 급수. 예:

  2의 거듭제곱 = [ n   n <-> 1, 2*n .. ] 

이 두 가지 예에서 알 수 있듯이, 미란다는 무한한 수의 원소를 가진 목록을 허용하며, 그 중 가장 단순한 것은 모든 양의 정수 목록입니다.[1..]

함수 어플리케이션의 표기법은 다음과 같이 단순 병치입니다.sin x.

미란다의 경우, 대부분의 다른 순수 기능 언어와 마찬가지로 함수는 1등급 시민이다. 즉, 함수는 다른 함수의 인수로서 전달되거나 결과로 반환되거나 데이터 구조의 요소로 포함될 수 있다.또한 파라미터가 2개 이상인 함수는 파라미터의 전체 수보다 적은 인수를 제공함으로써 "부분적으로 파라미터화"되거나 큐레이션될 수 있습니다.그러면 나머지 파라미터가 지정되면 결과를 반환하는 다른 함수가 제공됩니다.예를 들어 다음과 같습니다.

  더하다 a b = a + b   증량 = 더하다 1 

는 함수 "sublic"을 만드는 우회적인 방법입니다.이 함수는 인수를 추가합니다.실제로는add 4 72-파라미터 함수를 사용합니다.add에 적용됩니다.4인수에 4를 추가하는 단일 매개 변수 함수를 얻은 후 이를 적용합니다.7.

두 개의 파라미터(오퍼랜드)를 가진 함수는 모두 infix 연산자로 변환할 수 있습니다(예를 들어 다음과 같이 정의됨).add위의 함수, 용어$add어느 모로 보나 같은 것이다.+연산자) 및 두 개의 파라미터를 사용하는 모든 infix 연산자를 해당 함수로 전환할 수 있습니다.다음과 같이 됩니다.

  증량 = (+) 1 

인수에 함수를 추가하는 가장 간단한 방법입니다.마찬가지로,

   = (/ 2)   상호의 = (1 /) 

두 개의 단일 파라미터 함수가 생성됩니다.인터프리터는 각 경우에 나눗셈 연산자의 두 파라미터 중 어떤 파라미터가 공급되고 있는지를 이해하고 각각 숫자를 2로 나누고 그 역수를 반환하는 함수를 제공합니다.

미란다는 강력한 타입의 프로그래밍 언어이지만 명시적인 타입 선언을 고집하지는 않습니다.함수의 유형이 명시적으로 선언되지 않은 경우 인터프리터는 해당 파라미터의 유형과 함수 내에서 사용되는 방법에서 함수를 추론합니다.기본 타입에 가세해(char,num,bool) 에는 목록 표시 기능에서와 같이 파라미터 유형이 중요하지 않은 "anything" 유형이 포함됩니다.

  리비전 [] = []   리비전 (a:x) = 리비전 x ++ [a] 

명시적 함수 유형 선언이 다음과 같은 데이터 유형 목록에 적용할 수 있습니다.

  리비전 :: [*] -> [*] 

마지막으로 내부 기능이 이러한 모듈을 호출하는 프로그램에 보이지 않는 프로그램 모듈을 만들고 관리하기 위한 메커니즘을 가지고 있다.

샘플코드

다음 미란다 스크립트는 숫자 집합의 모든 하위 집합 집합을 결정합니다.

 서브셋 []     = [[]]  서브셋 (x:xs) = [[x] ++ y   y <-> ys] ++ ys                   어디에 ys = 서브셋 xs 

그리고 이건 함수에 대한 리터럴한 대본입니다primes모든 소수 목록을 제공합니다.

> 모든 소수의 무한 리스트.잠재 소수 목록은 2 이후의 모든 정수로 시작됩니다. 각 소수가 반환될 때 소수로 정확히 나눌 수 있는 다음 숫자는 모두 후보 목록에서 제외됩니다.> 소수 = 체 [2..] > 체 (p:x) = p : 체 [n n <- x; n mod p ~= 0]

여기 몇 가지 예가 더 있습니다.

최대 2 :: 숫자 -> 숫자 -> 숫자 최대 2 a b = a, 한다면 a>b          = b, 그렇지않으면  최대 3 :: 숫자 -> 숫자 -> 숫자 -> 숫자 최대 3 a b c = 최대 2 (최대 2 a b) (최대 2 a c)  곱하다 :: 숫자 -> 숫자 -> 숫자 곱하다 0 b = 0 곱하다 a b = b + (곱하다 (a-1) b)  실패하다 :: 숫자 -> 숫자 실패하다 0 = 1 실패하다 n = n * (실패하다 n-1)    품번::[*]->숫자 품번 [] = 0 품번 (a:x) = 1 + 품번 x  평일::=   우리가 Th(Th) 프루    is Work Day :: 평일 -> 부울 is Work Day  = 거짓의 is Work Day  = 거짓의 is Work Day 어느 날이나 = 진실의   트리 * ::= E  N (트리 *) * (트리 *)  노드 마운트 :: 트리 * -> 숫자 노드 마운트 E = 0 노드 마운트 (N l w r) = 노드 마운트 l + 1 + 노드 마운트 r  빈 카운트 :: 트리 * -> 숫자 빈 카운트 E = 1 빈 카운트 (N l w r) = 빈 카운트 l + 빈 카운트 r    트리 예시 = N ( N (N E 1 E) 3 (N E 4 E)) 5 (N (N E 6 E) 8 (N E 9 E)) 요일 트리 = N ( N (N E  E)  (N E 우리가 E)) Th(Th) (N (N E 프루 E)  (N E ))  삽입하다 :: * -> 스트리 * -> 스트리 * 삽입하다 x E = N E x E 삽입하다 x (N l w E) = N l w x 삽입하다 x (N E w r) = N x w r 삽입하다 x (N l w r) = 삽입하다 x l , 한다면 x < >w                    = 삽입하다 x r , 그렇지않으면  list2search 트리 :: [*] -> 트리 * list2search 트리 [] = E list2search 트리 [x] = N E x E list2search 트리 (x:xs) = 삽입하다 x (list2search 트리 xs)  최대 :: 트리 * -> * 최대 E = 에러 "비었다" 최대 (N l w E) = w 최대 (N l w r) = 최대 r  미넬 :: 트리 * -> * 미넬 E = 에러 "비었다" 미넬 (N E w r) = w 미넬 (N l w r) = 미넬 l    트래버스: 가는 중 통해. 가치  트리, 놓는 것 그들.  목록.  예약 주문,유효한,우편 주문 :: 트리 * -> [*] 유효한 E = [] 유효한 N l w r = 유효한 l ++ [w] ++ 유효한 r  예약 주문 E = [] 예약 주문 N l w r = [w] ++ 예약 주문 l ++ 예약 주문 r  우편 주문 E = [] 우편 주문 N l w r = 우편 주문 l ++ 우편 주문 r ++ [w]  높이 :: 트리 * -> 숫자 높이 E = 0 높이 (N l w r) = 1 + 최대 2 (높이 l) (높이 r)      :: 숫자 -> 숫자  x = x ,한다면 x >= 0  x = x*(-1), 그렇지않으면   그리고. :: 부울 -> 부울 -> 부울 그리고. 진실의 진실의 = 진실의 그리고. x y = 거짓의     A AVL-트리  a 트리 어디에  차이 사이에  어린아이 노드  것은 아니다. 더 높은 보다 1    i 여전히 갖고 있다 로. 시험 이것.  Avl :: 트리 * -> 부울 Avl E = 진실의 Avl (N l w r) = 그리고. (Avl l) (Avl r), 한다면  ((노드 마운트 l) - (노드 마운트 r)) < > 2                 = 거짓의, 그렇지않으면                                                     삭제하다 :: * -> 트리 * -> 트리 * 삭제하다 x E = E 삭제하다 x (N E x E) = E 삭제하다 x (N E x r) = N E (미넬 r) (삭제하다 (미넬 r) r) 삭제하다 x (N l x r) = N (삭제하다 (최대 l) l) (최대 l) r 삭제하다 x (N l w r) = N (삭제하다 x l) w (삭제하다 x r) 

레퍼런스

  1. ^ Turner, D. A. (1985). Jouannaud, Jean-Pierre (ed.). "Miranda: A non-strict functional language with polymorphic types". Functional Programming Languages and Computer Architecture. Lecture Notes in Computer Science. Berlin, Heidelberg: Springer. 201: 1–16. doi:10.1007/3-540-15975-4_26. ISBN 978-3-540-39677-2.
  2. ^ Hudak, Paul; Hughes, John; Peyton Jones, Simon; Wadler, Philip (2007-06-09). "A history of Haskell: Being lazy with class". Proceedings of the Third ACM SIGPLAN Conference on History of Programming Languages. New York, NY, USA: ACM. doi:10.1145/1238844.1238856. S2CID 52847907.
  3. ^ Turner, David (2021-03-22). "Open Sourcing Miranda". Code Sync. London (published November 2020). Retrieved 2021-12-30.{{cite web}}: CS1 maint :url-status (링크)
  4. ^ "Miranda download page". www.cs.kent.ac.uk. Retrieved 2021-12-30.{{cite web}}: CS1 maint :url-status (링크)

외부 링크