라켓 기능

Racket features

라켓은 1990년대 중반부터 프로그래밍 언어 연구의 수단으로 활발하게 개발되어 왔으며, 오랜 세월 동안 많은 특징을 축적해 왔다.이 문서에서는 이러한 기능의 일부에 대해 설명하고 시연합니다.Racket의 주요 설계 목표 중 하나는 도메인 고유의 언어 및 완전히 새로운 [1]언어의 창조에 대응하는 것입니다.따라서 다음 예 중 일부는 다른 언어로 되어 있지만 모두 Racket으로 구현되어 있습니다.자세한 내용은 본문을 참조해 주세요.

핵심 Racket 구현은 매우 유연합니다.사투리를 사용하지 않아도 풀 기능의 스크립트 언어로서 기능할 수 있습니다.Windows 네이티브 GUI를 사용하거나 사용하지 않고 실행할 수 있으며 웹 서버 작성에서 그래픽스까지 작업을 수행할 수 있습니다.

런타임 지원

가비지 수집, 테일 콜 및 우주 안전

라켓은 세 가지 다른 쓰레기 수집기를 사용할 수 있습니다.

  • 원래는 보수적인 Boehm 가비지 컬렉터가 사용되었습니다.단, 웹 서버 등의 장기 실행 프로세스에서는 보수적인 수집은 실용적이지 않습니다.이러한 프로세스에서는 메모리 누설이 천천히 발생하는 경향이 있습니다.또한 보수적인 수집기가 특정 프로그램을 실행할 수 없을 정도로 빠르게 메모리를 누출하는 병리적인 경우도 있습니다.예를 들어 무한 목록을 통과할 때 포인터를 유지하는 한 번의 보수적인 실수로 인해 전체 목록이 메모리에 유지되고 사용 가능한 메모리가 빠르게 오버플로우됩니다.이 컬렉터는 Racket 커뮤니티에서는 'CGC'라고 불리는 경우가 많습니다.
  • SenoraGC는 주로 디버깅과 메모리 트레이스를 목적으로 하는 대체 보수적 가비지 컬렉터입니다.
  • Moving Memory Manager(일명 '3m')는 정밀 가비지 컬렉터이며 2007년부터 Racket의 디폴트 컬렉터입니다.이 수집기는 세대별로 관리자에 의한 메모리계정을 지원합니다(아래 참조).Collector는 C 소스 트랜스로서 실장되어 있으며, 그 자체가 Racket에 기술되어 있습니다.따라서 빌드 프로세스에서는 부트스트래핑에 보수적인 컬렉터를 사용합니다.

Scheme 패밀리의 모든 구현과 마찬가지로 Racket은 풀 테일콜 제거를 구현합니다.라켓은 한 걸음 더 나아가 라이브 변수 분석을 통해 언어를 공간용으로 완전히 안전하게 만듭니다.이는 정확한 가비지 컬렉터를 보완하며, 경우에 따라서는 Lazy Racket 구현과 같이 두 가지 기능이 적절한 실행에 매우 중요합니다.이는 람다 리프팅 및 저스트타임 컴파일과 같은 추가 컴파일러 최적화와 더불어 이루어집니다.

시스템 인터페이스 및 스크립트

Racket의 시스템인터페이스에는 비동기 논블로킹 I/O, 그린 스레드, 동기화 채널, 세마포어, 서브프로세스TCP 소켓이 포함됩니다.

다음의 프로그램은, 포토 12345 로 「에코 서버」를 기동합니다.

#실패하다라켓  (정의하다 청취자 (tcp-listen 12345))  (허락하다 에코 서버 ()   ;; TCP 서버를 만듭니다.   (정의값 (에서 나가.) (tcp-accept 청취자))   ;; (녹색) 스레드에서 착신 연결을 처리합니다.   ( (λ () (복사 포트 에서 나가.) (출력 포트를 닫다 나가.)))   ;; 즉시 루프백하여 추가 클라이언트를 받아들인다.   (에코 서버)) 

동적 컴파일과 풍부한 시스템인터페이스의 조합으로 Racket은 Perl 또는 Python과 유사한 스크립트 언어입니다.

다음 예시는 현재 디렉토리에서 시작하는 디렉토리 트리를 걷는 방법을 보여 줍니다.를 사용합니다.in-directory트리를 걷는 시퀀스를 구성하는 함수입니다.for결속하다path시퀀스 내의 각 경로로 이동합니다.regexp-match?는 이러한 경로를 지정된 regexp 패턴과 대조하여 테스트합니다.

#실패하다라켓 ;; 모든 서브디르에서 라켓 소스를 찾습니다.  (위해서 ([경로. (디렉토리 내의)]) ; 현재의 트리에서 반복한다.   (언제 (regexp-match? #syslog.rkt$" 경로.)     (인쇄물 "소스 파일: ~a\n" 경로.))) 

다음 예제에서는 해시 테이블을 사용하여 이전에 본 행을 기록하고 원하는 행만 인쇄합니다.

#실패하다라켓 ;; stdin에서 각 고유 행을 보고한다.  (허락하다 ([봤다 (제조법)])   (위해서 ([ (인라인)])     (~하지 않는 한 (해시 참조 봤다  #f)       (표시 ))     (해시 세트! 봤다  #t))) 

이 두 프로그램 모두 DrRacket 또는 명령줄에서 실행할 수 있습니다.racket실행 가능.Racket은 첫 번째 shebang 행을 무시하므로 이러한 프로그램을 실행 가능한 스크립트로 전환할 수 있습니다.다음 스크립트는 명령줄 인수 해석에 Racket 라이브러리를 사용하는 것 외에 이를 보여 줍니다.

#!/usr/bin/env 라켓 #실패하다라켓  (명령줄  #: 기능 (밑바탕에 깔때기 익스텐트 참조.)  (위해서 ([p (디렉토리 내의)]        #: 언제 (regexp-match? (현악기 "[.]" 익스텐트 "$") p)        [( 숫자) (사내의 (파일 -> 행 p))])    (언제 (regexp-match? (프리젝트 참조.) )      (인쇄물 "~a:~a:~a~n" p (+ 숫자 1) )))) 

이 스크립트는 GREP와 같은 유틸리티로 기본 디렉토리, 파일 이름 확장자 및 (perl 호환) 정규 표현이라는3개의 명령줄 인수를 필요로 합니다.기본 디렉토리에서 지정된 서픽스를 가진 파일이 있는지 검사하고 regexp 패턴과 일치하는 행을 인쇄합니다.

자원 관리 및 샌드박스화

라켓은 자원 매니저로서 기능하는 가치의 일종인 「고객」의 개념을 특징으로 하고 있습니다.이것은 네트워크 서버에서 자주 사용됩니다.네트워크 서버에서는 각 접속이 새로운 관리자에 의해 처리되기 때문에 핸들러에 의해 열려 있을 가능성이 있는 모든 자원(예를 들어 열려 있는 포트)을 간단하게 「청소」할 수 있습니다.다음은 이러한 관리자에 의한 "에코 서버"의 예를 확장한 것입니다.

#실패하다라켓  (정의하다 청취자 (tcp-listen 12345))  ;; 연결 단위 핸들러 (정의하다 (핸들러 에서 나가.)   (복사 포트 에서 나가.)   (출력 포트를 닫다 나가.))  (허락하다 에코 서버 ()   (정의값 (에서 나가.) (tcp-accept 청취자))   ( (λ () (허락하다 ([c (메이커리)])                   (파라미터화하다 ([전류에 관한 c])                     (핸들러 에서 나가.)                     (모든 관리인 c)))))   (에코 서버)) 

3m 가비지 콜렉터의 메모리 어카운팅 기능 및 런타임의 추가 측면을 제어하는 많은 런타임 파라미터와 조합된 관리자에 의해 완전히 안전한 샌드박스 실행 컨텍스트를 작성할 수 있습니다.racket/sandbox라이브러리는 이러한 기능을 간단한 방법으로 제공합니다.다음으로 지정된 포트에 'REPL 서버'를 작성하는 예를 나타냅니다.이 포트에 접속하는 것은 샌드박스의 다양한 보호 측면의 영향을 받는다는 점을 제외하고 일반 Racket REP와 같습니다.예를 들어 이 리플리케이션에서 파일 시스템에 액세스하거나 네트워크 연결을 만들거나 하위 프로세스를 실행하거나 너무 많은 시간 또는 메모리를 사용할 수 없습니다(실제로 이 리플리케이션은 공개적으로 배포해도 충분히 안전합니다).

#실패하다라켓 (요구하다 라켓/라켓) (정의하다 e (제조자 '라켓/베이스)) (렛밸류 ([(i o) (tcp-accept (tcp-listen 9999))])   (파라미터화하다 ([전류 입력 포트  i]                  [전류 출력 포트 o]                  [current-error 포트  o]                  [현재 평가의 e]                  [전류 판독 상호 작용 (λ (x ) (읽어주세요 ))])     (판독 평가 인쇄 루프)     (인쇄 o "\n안녕...\n")     (출력 포트를 닫다 o))) 

웹 및 네트워크 프로그래밍

다음 예제에서는 를 사용하여 웹 서버를 구현합니다.web-server/insta언어.서버에 접속할 때마다start함수가 호출되어 클라이언트에 반환되는HTML 이 취득됩니다.

#실패하다웹 서버/인스타 ;; 작은 "hello world" 웹 서버  (정의하다 (개시하다 부탁한다)   (응답/xexpr '(html ( '헬로 월드')))) 

라켓에는 스크래퍼나 로봇을 쓸 때 필요한 기능도 포함되어 있습니다.예를 들어, 다음 함수는 검색 문자열에 대한 Google 결과를 나열합니다.

#실패하다라켓 ;; 심플한 웹 스크레이퍼  (요구하다 넷/url 넷/우리콘)  (정의하다 (렛미구글 스트레이트)   (렛* ([g "http://www.google.com/search?q="]          [u (현악기 g (uri의 개재에 의한 스트레이트))]          [rx #class("?=<h3 class=\"r\">.*?(?=</h3>)"])     (regexp-match* rx (get-pure-port의 (string->url u))))) 

라이브러리는 http 이외의 프로토콜도 지원합니다.

#실패하다라켓 ;;; 라켓에서 시간 제한 이메일 알림 보내기  (요구하다 인터넷/전송)  (수면. (* (- (* 60 4) 15) 60)) ; 3시간 45m 대기  (송신 메일 메시지  (getenv "이메일") "주차 미터 경보!"  (목록. (getenv "이메일")) 무효 무효  '("나가서 차를 옮겨야 할 시간이다.")) 

그래픽스

그래픽 기능은 다양한 사용자를 대상으로 하는 여러 가지 다른 맛으로 제공됩니다.2htdp/image라이브러리는 이미지를 구성하기 위한 편리한 기능을 제공합니다.이 라이브러리는 주로 HtDP 기반 과정의 학생들이 사용합니다.다음 예제에서는sierpinski함수를 정의하고 호출하여 깊이 8의 시에르핀스키 삼각형을 생성합니다.

#실패하다라켓 ;; 그림  (요구하다 2htdp/이미지)  (허락하다 sierpinski ([n 8])   (한다면 (제로? n)     (삼각형의 2 '단단한 '빨간.)     (허락하다 ([t (sierpinski (- n 1))])       (얼다 (위에 t (게다가 t t)))))) 

DrRacket 에디터는 이미지를 포함할 수 있으며, DrRacket은 다른 유형의 값(정수나 목록 등)과 마찬가지로 이미지 값을 표시합니다.예를 들어 위의 프로그램을 실행하면 실제로 Sierpinski 삼각형이 표시되며, 이 삼각형을 잘라내어 다른 프로그램에 붙여넣을 수 있습니다.

plot라이브러리는 보다 성숙한 독자와 요구를 위한 이미지 가치를 구축합니다.예를 들어, 다음 프로그램은 두 ×R × {\ \} \ \ \times 3차원) 가우측 합계를 동심원의 부분 투명한 표면으로 표시합니다.

#실패하다라켓 ;; 2개의 3D 가우시안 합계를 동심원 등각면으로 시각화한다. ;; 주의: 이 예에서는 Racket 5.2 이후가 필요합니다.  (요구하다 줄거리.)  ;; (cx,cy,cz)에 중심을 둔 R x R x R -> R 가우스 함수를 반환합니다. (정의하다 ((가우스 cx 사이 cz) x y z)   (exp (- (+ (스쿠르 (- x cx)) (스쿠르 (- y 사이)) (스쿠르 (- z cz))))))  ;; 3원 함수에서 작동하기 위한 리프트 + (정의하다 ((f3+ g h) x y z) (+ (g x y z) (h x y z)))  ;; 2개의 가우시안 합계를 나타내는 이미지 값을 구성합니다. (플롯3d (등각면 3d (f3+ (가우스 0 0 0) (가우스 1.5 -1.5 0))                        -1 2.5 -2.5 1 -1 1                        #: 라벨 "g"))  ; 라벨이 범례를 추가합니다. 

여기, 그isosurfaces3d함수는 첫 번째 인수에 대해 3개의 함수를 필요로 합니다.f3+저장품.이미지 값을 구성하는 것 외에plotPNG, PDF, PostScriptSVG 형식의 파일도 쓸 수 있습니다.

GUI 프로그래밍

Racket은 위에서 설명한 라이브러리가 기반으로 하는 휴대용 GUI 레이어를 구현합니다.네이티브 Windows API, Mac OS X의 코코아, Linux 의 GTK+를 통해 구현됩니다.Racket API는 클래스 기반의 툴킷으로 원래 사용되던 wxWidgets와 다소 관련이 있습니다.

다음 간단한 추측 게임에서는 GUI 툴킷을 사용한 코딩 방법을 보여 줍니다.frame%class는 최상위 창을 구현합니다.button%는 버튼을 구현합니다.check여기서 정의한 함수는 버튼의 콜백 동작에 사용되는 함수를 생성합니다.

#실패하다라켓/구이 ;; GUI 추측 게임  (정의하다 시크릿 (랜덤 5))  (정의하다 f (신규 프레임 % [라벨. "맞히기 게임"])) ; 최상위 창 (정의하다 t (신규 메시지 % [부모 f]                [라벨. "내가 생각하는 숫자는 알아맞힐 수 있어?"])) (정의하다 p (신규 수평-표준% [부모 f]))    ; 수평 컨테이너  (정의하다 ((체크하다 i) btn 에바토)   (메시지 박스 "." (견디다 [(< > i 시크릿) "너무 작아요"]                          [(> i 시크릿) "너무 커"]                          [또 다른         "바로 그거야!"]))   (언제 (= i 시크릿) (보내세요 f 표시하다 #f)))         ; success => 창을 닫습니다.  (위해서 ([i (범위 내의 10)])                        ; 모든 버튼을 만듭니다.   (오브젝트를 만들다 단추 % (포맷 "~a" i) p (체크하다 i)))  (보내세요 f 표시하다 #t) ; 응용 프로그램을 시작하기 위한 창을 보여줍니다. 

GUI는 이러한 방법으로 수동으로 코딩할 수도 있고 [2]PLaneT에서 사용할 수 있는 GUI 디자이너 프로그램을 사용하여 코딩할 수도 있습니다.

슬라이드 쇼

슬라이드 기반 프레젠테이션은 Racket에서 다음을 사용하여 개발할 수도 있습니다.slideshow언어, 비머와 비슷하지만 라켓의 프로그래밍적 기능을 가지고 있습니다.슬라이드의 요소는 조합할 수 있는 그림입니다.

예를 들어, 다음 프로그램은 제목 슬라이드를 전체 화면에 표시한 다음 슬라이드와 사진을 표시합니다.vc-append그리고.hc-append다른 축을 중심으로 수직과 수평으로 사진을 결합합니다.

#실패하다슬라이드 쇼  (미끄러지다  (본문 '슬라이드쇼' '로만 56)  (본문 "라켓으로 발표하기"        '로만 40))  (미끄러지다  #: 삭제 "사진 몇 장"  (적용합니다. vc-displiction(vc-displicate)         (대상/목록 ([i 5])           (정의하다 (스케일+컬러 p c)              (색을 입히다 (규모. p (/ (추가 1 i) 5)) c))           (hc-internal의             (스케일+컬러 (충전된 100 50)  "진청색")            (스케일+컬러 (디스크 100)                 "진녹색")            (스케일+컬러 (화살표 100 (/ 파이 6))       "어두운")            )))) 

확장 패키지는 예를 들어 [2]LaTeX 요소를 포함하는 등의 PLaneT에도 존재합니다.

외부 기능 인터페이스

라켓은 libffi에 기반한 외부 기능 인터페이스를 갖추고 있습니다.이 인터페이스에서는 안전하지 않은 저레벨의 C라이크 코드를 쓸 수 있습니다.이 코드에서는 메모리 할당, 포인터 참조 해제, 공유 라이브러리의 함수 호출 및 Racket 함수에 콜백(libffi 클로저를 사용)을 송신할 수 있습니다.코어 실장은 libffi 상단의 씬 레이어(C로 기술)이며, 그 후 완전한 인터페이스는 Racket 코드를 통해 구현됩니다.인터페이스는 매크로를 광범위하게 사용하기 때문에 표현력이 뛰어난 Racket 기반의 인터페이스 기술 언어가 됩니다.이 언어에는 고차 함수의 균일한 표현(콜백과 콜아웃이 다른 경우의 트랩 회피), 플레인 Racket 구조와 유사한 구조 정의 및 입력 및 출력 포인터를 나타낼 수 있는 커스텀 함수 타입, 암묵적 인수(예를 들어 다음과 같은 인수) 등 많은 유용한 기능이 있습니다.는 다른 인수로 전달되는 벡터 내의 요소의 수를 나타내고 있습니다).이 인터페이스를 사용하여 기본 GUI 툴킷에 액세스함으로써 Racket은 자체 GUI 레이어를 완전히 [3]Racket에 구현합니다.

FFI는 라이브러리용 완전한 글루 레이어 작성부터(Racket의 OpenGL 바인딩에서처럼), 하나의 외부 기능을 빠르게 추출하는 등 다양한 방법으로 사용할 수 있습니다.후자의 접근방식의 예는 다음과 같습니다.

#실패하다라켓/베이스 ;; FFI의 간단한 사용  (요구하다 ffi/filename의 경우)  (정의하다 mci-send-string   (ffi-obj를 취득하다 mci Send StringA" "윈음"     (_재미있다 _문자열 [_개요 = #f] [_int = 0] [_개요 = #f]           -> [리트 : _int]))) (mci-send-string "사운드 재생"wav wait") 

언어 확장자

라켓의 가장 주목할 만한 특징은 새로운 도메인 고유범용 언어를 구축하는 능력이다.이는 다음과 같은 여러 가지 중요한 기능을 조합한 결과입니다.

  • 코드 링크 및 네임스페이스 관리에 사용되는 유연한 모듈 시스템,
  • 새로운 구문 형식을 만들 수 있는 광범위한 매크로 시스템(컴파일러-API로 기능)
  • 풍부한 런타임 시스템으로 언어 구현자가 사용할 수 있는 기능(예: 연속성, 자원 관리)을 제공합니다.
  • 새로운 언어 구문의 파서를 지정(및 구현)하는 방법.

모듈 시스템은 이러한 기능을 결합하여 여러 모듈에 걸쳐 서로 다른 언어로 코드를 작성할 수 있도록 하는 데 중요한 역할을 합니다.

이러한 언어는 Racket 배포 및 사용자 라이브러리에서 광범위하게 사용됩니다.사실, 새로운 언어를 만드는 것은 매우 간단해서 몇몇 언어들은 거의 사용되지 않습니다.

라켓에는 여러 가지 유용한 언어가 포함되어 있으며, 일부는 라켓의 기본 언어와는 매우 다릅니다.

낙서

라켓의 문서 시스템인 스크라이브는 산문 작성에 사용되는 여러 언어의 형태로 제공됩니다.그것은 라켓의 문서 작성과 책이나 기사 작성에 사용된다.사실, 그것은 하나의 "스크라이브" 언어라기보다는, 각각 다른 목적을 위한 (매우 유사한) 방언의 어족입니다.

다음 예제를 실행하려면 DrRacket에 복사하고 표시되는 두 개의 낙서 렌더링 버튼 중 하나를 클릭합니다(PDF 렌더링은 pdfTeX 필요).또는 를 사용합니다.scribble실행 가능한 파일입니다.

#lang 낙서/base @; "scribble" @ ( require ( planet neil / numspell ) @title {99 Bottes of Beer }생활에서 @emph { blah blah }가 필요한 경우 PDF 또는 HTML 문서를 생성하십시오.@(항목목록(for/list([n(in-range 99 0-1)])(정의 N(number->english n))(정의 N--(number->english(sub1 n)))) @item{@string-titlecase[N] 맥주병, 맥주 @N병.벽에 맥주 한 병씩 갖다 놓고 돌리면 돼}))

Scribble 언어의 가장 놀라운 특징은 텍스트가 풍부한 [4]코드를 위해 특별히 설계된 새로운 구문을 사용하는 것입니다.이 구문은 자유 형식 텍스트, 문자열 보간, 사용자 지정 가능한 따옴표를 허용하며 텍스트 전처리, 텍스트 생성 및 HTML 템플릿 시스템 등의 다른 응용 프로그램에서 유용합니다.이 구문은 플레인 S 식을 확장하며 이러한 식에 대한 대체 입력으로 구현됩니다.

#lang 낙서/텍스트 안녕하세요.텍스트 파일입니다.실행해주세요.@ ( define ( thrice . text )@list { @text , @text } @thrice {스팸! @thrice{햄!

활자형 라켓

타입드 라켓은 정적인 타입의 라켓입니다.이 회사가 구현한 유형 시스템은 개발 동기가 가능한 한 많은 관용적인 Racket 코드를 수용하기 위한 것이라는 점에서 독특합니다. 그 결과 하위 유형, 유니언 [5]등이 포함됩니다.Type Racket의 또 다른 목표는 프로그램의 일부를 Type 언어로 이행할 수 있도록 하는 것입니다.따라서 Type되지 않은 코드에서 Type 코드를 호출하는 것을 수용하고, Type [6]불변성을 강제하기 위한 동적 계약을 생성합니다.이것은, 「스크립트」로부터 「어플리케이션」으로 성숙하기 때문에, 애플리케이션의 라이프 타임 스테이지에 있어서 바람직한 기능으로 간주되고 있습니다.이 경우, 정적 타이핑은 대량의 코드의 유지보수에 도움이 됩니다.

#실패하다타이핑된/인쇄된  ;; 고차 오카렌스 타이핑 사용 (정의형 스트링 오어 넘 (U 스트링 번호))  (: 토그 ((리스트 스트링 오어 넘) -> 스트링)) (정의하다 (토그 l)   (적용합니다. 현악기 (필터 스트링? l)))  (토그 (목록. 5 "안녕하세요" 1/2 "세계" (sqrt -1))) 

게으른 라켓

lazylanguage는 Haskell과 유사한 평가 시멘틱스를 가진 언어입니다.다음 예제에서는fibs출력에 1000번째 요소가 필요할 때까지 계산되지 않는 무한 리스트입니다.

#실패하다게으른 ;; 무한 리스트: (정의하다 파이브   (리스트* 1 1 (지도 + 파이브 (CDR 파이브))))  ;; 1000번째 피보나치 번호를 인쇄합니다. (인쇄물 (리스트 참조 파이브 1000)) 

논리 프로그래밍

라켓에는 다음 3가지 로직 프로그래밍 언어가 있습니다.Racklog, Prolog와 같은 언어, Datalogger 구현, miniKanren 포트.Scribble 구문과 달리 이들 언어 중 처음 두 언어는 S-표현의 확장이 아닌 완전히 새로운 구문을 사용합니다.DrRacket에서 사용하는 경우 적절한 강조 표시, 일반적인 도구 호스트 체크 구문 및 Prolog/Datalog REP가 제공됩니다.

#실패하다 데이터로그  조상(A, B) :- 부모(A, B). 조상(A, B) :-   부모(A, C), D = C, 조상(D, B). 부모(존., 더글라스). 부모(밥., 존.).  조상(A, B)? 

교육 도구

라켓을 개발하는 PLT 그룹은 전통적으로 모든 레벨의 교육에 관여해 왔습니다.이 그룹이 추진한 가장 초기의 연구 아이디어 중 하나는 언어 수준을 사용하는 것인데, 이것은 새로운 학생들에게 학생들의 지식 수준에 맞는 유용한 오류 메시지를 제공하는 것이다.이 접근방식은 여러 PLT 개발자가 집필한 교재인 프로그램 설계 방법 및 ProgramByDesign 프로젝트에서 많이 사용되고 있습니다.다음 프로그램은htdp/bsl: "학생 언어"입니다.를 사용합니다.2htdp/image교육 언어로 그림을 만들기 위한 라이브러리, 그리고2htdp/universe인터랙티브 애니메이션을 위한 라이브러리.

#실패하다htdp/bsl ;; 임의의 키가 풍선을 부풀린다.  (요구하다 2htdp/이미지) (요구하다 2htdp/표준)  (정의하다 (풍선 b) (원형 b 「솔리드」 "빨간색"))  (정의하다 (폭발. b k) (+ b 5))  (정의하다 (감압하다 b) (맥스. (- b 1) 1))  (빅뱅 50 (온키 폭발.) (온티크 감압하다)           (그릴 것 풍선 200 200)) 

알골

라켓에는 ALGOL 60 언어가 완전하게 실장되어 있습니다.

#언어 알골60 시작한다.   정수 절차. 시그마(x, i, n);     가치 n;     정수 x, i, n;   시작한다.     정수 ;      := 0;     위해서 i := 1 걸음 1 까지 n 하다        :=  + x;     시그마 := ;   끝.;   정수 q;   인쇄(시그마(q*2-1, q, 7)); 끝. 

Plai 및 Plai 타입

 #실패하다플라스틱 
 #실패하다플라스틱의 

또 다른 지원 언어는 라켓과 같이 타이핑하거나 타이핑하지 않는 언어입니다.「플라이로 기술된 모듈은 (스킴과는 달리)[7] 모든 정의를 내보냅니다.」 「유형화된 PLAI 언어는, 정적으로 입력되는 것이 가장 중요합니다.또한 define-type, type-case 및 [8]test와 같은 유용한 새로운 구성 요소도 제공합니다."

기타 언어

마지막으로 새로운 언어의 구현 예를 나타냅니다.

#실패하다라켓 (제공하다 (예외적인 (전면적인 라켓)                      #%상위 # % app)          (이름 변경 [정상 #%상위] [앱. # % app])) (define-timeout-rule(정의규칙) (정상 . x) 'x) (define-timeout-rule(정의규칙) (앱. f . xs)   (한다면 (해시? f) (해시 참조 f . xs) (f . xs))) 

이 언어:

  • 에서 모든 것을 제공합니다.racket언어, 그래서 약간 비슷한 변종이다.
  • 언바인드 변수 룩업과 함수 호출을 구현하는2개의 특별한 "훅 매크로"를 제외하고 이들 대신 새로운 형식이 에 제공됩니다.
    • 모든 미지의 변수를 암묵적으로 인용하다
    • 해시 테이블을 함수로 사용할 수 있습니다.여기서 인수는 해시 테이블 [9]검색에 사용됩니다.

이 코드가 에 저장되어 있는 경우mylang.rkt다음과 같이 사용할 수 있습니다.

#실패하다s-exp mylang.rkt ; sexpr 구문, mylang 의미론 사용 (정의하다 h (메이크 하셰크)) (해시 세트! h A B)        ; A와 B는 여기서 자가평가하고 있다. (h A)                    ; 해시 테이블은 함수로 사용됩니다. 

레퍼런스

  1. ^ Tobin-Hochstadt, S.; St-Amour, V.; Culpepper, R.; Flatt, M.; Felleisen, M. (2011). "Languages as Libraries" (PDF). Programming Language Design and Implementation.
  2. ^ a b PLaneT: 라켓 집중형 패키지 유통 시스템
  3. ^ "Rebuilding Racket's Graphics Layer". 2010-12-08. Archived from the original on 2013-02-02. Retrieved 2013-07-07.
  4. ^ Barzilay, E. (2009). "The Scribble Reader" (PDF). Scheme and Functional Programming.
  5. ^ Tobin-Hochstadt, S.; Felleisen, M. (2008). "The Design and Implementation of Typed Scheme". Principles of Programming Languages.
  6. ^ Tobin-Hochstadt, S.; Felleisen, M. (2006). "Interlanguage Migration: From Scripts to Programs". Dynamic Languages Symposium.
  7. ^ "1 PLAI Scheme".
  8. ^ 크리슈나무르티, 슈리람"프로그래밍 언어:응용 프로그램 및 해석"프로그래밍 언어:응용 프로그램 및 해석.브라운 대학교, N.D. Web. 2016년 3월 14일<http://cs.brown.edu/courses/cs173/2012/book/>.
  9. ^ 주의:#%app는 모든 함수 호출에서 사용되는 매크로입니다.모든 함수 호출에 추가 조건이 발생하기 때문에 이 언어는 그다지 효율적이지 않습니다.또한 매크로는 함수식을 두 번 평가하므로 좋은 매크로 프로그래밍의 예로 간주해서는 안 됩니다.

외부 링크