LFE(프로그래밍 언어)

LFE (programming language)
LFE
LFE (Lisp Flavored Erlang) Logo.png
패러다임멀티패러다임:동시,기능
가족얼랑, 리스프
설계자로버트 버딩
개발자로버트 버딩
처음 등장한2008년, 14년 전(2008년)
안정된 릴리스
1.3 / 2017년 6월 4일, 5년 전(2017-06-04)
타이핑 분야다이내믹, 스트롱
구현 언어얼랑
플랫폼IA-32, x86-64
OS크로스 플랫폼
면허증.아파치 2.0
파일 이름 확장자.lfe .hrl
웹 사이트lfe.io
영향을 받다
Erlang, Common Lisp, Maclisp, Scheme, Elixir, Clojure, Hy
영향받은
Joxa, 동시 스키마

LFE(Lisp Flavored Erlang)는 Core Erlang 및 Erlang Virtual Machine(BEAM; 가상 머신)을 기반으로 하는 기능적동시 가비지 수집 범용 프로그래밍 언어 및 Lisp 방언입니다.LFE는 Erlang을 기반으로 구축되어 분산형, 폴트 톨러런스성, 실시간, 논스톱 애플리케이션을 쓰기 위한 Lisp 구문을 제공합니다.또한 LFE는 Lisp 매크로를 사용한 메타프로그래밍과 풍부한 기능의 Read-Eval-Print Loop(REPL;[1] 읽기 평가 인쇄 루프)을 통한 개발자 경험 향상을 지원하도록 Erlang을 확장합니다.LFE는 Erlang의 모든 최신 릴리스에서 지원되고 있습니다.지원되는 Erlang의 가장 오래된 버전은 R14입니다.

역사

로버트 버딩

초기 릴리즈

LFE에 대한 초기 작업은 Robert Virding이 Erlang에서 실행되는 [2]Lisp의 프로토타입을 만들기 시작한 2007년에 시작되었습니다.이 작업은 주로 구현의 해석과 탐색에 초점을 맞췄습니다.당시에는 버전 관리 시스템이 사용되지 않았기 때문에 정확한 초기 날짜를 추적하는 것은 [2]다소 문제가 있습니다.

버딩은 2008년 [3]3월에 Erlang Questions 메일목록에서 LFE의 첫 번째 릴리스를 발표했습니다.이 LFE 릴리스는 매우 제한적이어서 재귀적인 처리를 하지 않았습니다.letrecs,binarys,receive, 또는try; 또한 Lisp [4]쉘은 지원되지 않습니다.

LFE의 초기 개발은 Dell XPS [4]노트북의 Erlang[5] 버전 R12B-0에서 실시되었습니다.

1955 1960 1965 1970 1975 1980 1985 1990 1995 2000 2005 2010 2015 2020
LISP 1, 1.5, LISP 2(abandoned)
마클리스프
인터리스크
MDL
리스프 기계 리스프
스킴 R5RS R6RS R7RS 소형
없음
ZIL(Zork 구현 언어)
프란츠 리스프
일반적인 리스프
르 리스프
MIT 스킴
T
체즈 스킴
Emacs 리스프
자동 LISP
피코리스프
EuLisp
ISLISP
오픈리스프
PLT 방식 라켓
GNU Guile
비주얼 LISP
클로쥬르
LFE
하이

동기

Robert Virding은 [2]LFE 프로그래밍 언어를 시작한 데는 다음과 같은 몇 가지 이유가 있다고 합니다.

  • 그는 리스프에서 프로그래밍을 한 경험이 있다.
  • 이전의 경험으로 볼 때, 그는 자신의 리스프를 구현하는 데 관심이 있었다.
  • 특히 그는 Erlang에서 리스프를 구현하기를 원했습니다.그는 그것이 어떻게 계속 실행되고 Erlang과 통합될지 궁금했을 뿐만 아니라 어떻게 보일지 궁금했습니다.
  • Erlang 프로그래밍 언어 작성을 도왔기 때문에 BEAM 상에서 동작하도록 특별히 설계되어 Erlang/OTP와 완전히 상호작용할 수 있는 Lisp를 만드는 것이 목표였습니다.
  • 그는 얼랑에 대해 다른 언어를 편집하는 실험을 하고 싶었다.이와 같이 그는 LFE를 코어 Erlang을 생성하여 Erlang 컴파일러의 백엔드에 연결함으로써 이를 탐색하는 수단으로 간주했습니다.

특징들

  • Erlang 가상 머신(BEAM)을 대상으로 하는 언어
  • 심리스한 Erlang 통합: 제로 패널티 Erlang 함수 호출(및 그 반대)
  • 리스프 매크로를 통한 메타프로그래밍과 리스프 동질성
  • 소스 코드 코멘트와 문서 스트링을 모두 사용한 일반적인 리스프 형식의 문서
  • 무공유 아키텍처 메시지 전달을 통한 동시 프로그래밍(액터 모델)
  • 부작용 기반 루프 대신 재귀고차 함수 강조
  • 인터랙티브 개발 및 테스트를 위한 완전한 Read-Eval-Print Loop(REPL; 평가 인쇄 루프) (Erlang 쉘과 달리 LFE REP는 함수 및 매크로 정의를 지원합니다)
  • 패턴 매칭
  • 코드의 핫 로드
  • 변수 및 함수용 네임스페이스의 Lisp-2 분리
  • JInterface 및 Erjang을 통한 Java 상호 운용
  • 양쪽에서 스크립트 작성 기능lfe그리고.lfescript

구문 및 의미론

기호식(S-식)

LISP와 마찬가지로 LFE는 표현 지향 언어입니다.호모아이콘 프로그래밍 언어와 달리, Lisps는 표현식문장의 구문적 구분을 전혀 또는 거의 하지 않습니다. 모든 코드와 데이터는 표현식으로 작성됩니다.LFE는 Erlang VM에 동질성을 가져왔다.

리스트

LFE에서 목록 데이터 유형은 요소를 공백으로 구분하여 쓰고 괄호로 둘러싸여 있습니다.예를들면,(list 1 2 'foo)요소가 정수인 리스트입니다.1그리고.2, 및 원자.이들 값은 암묵적으로 입력됩니다.각각 2개의 정수와 심볼릭아톰이라고 불리는 리스프 고유의 데이터 타입이므로 그렇게 선언할 필요는 없습니다.

위의 예에서 보듯이 LFE 표현은 프리픽스 표기법을 사용하여 목록으로 작성됩니다.목록의 첫 번째 요소는 양식 이름(예: 함수, 연산자 또는 매크로)입니다.목록의 나머지 부분은 인수입니다.

연산자

LFE-Erlang 연산자도 같은 방법으로 사용됩니다.표현

 (* (+ 1 2 3 4 5 6) 2) 

42로 평가합니다.Erlang 및 LFE의 함수와는 달리, Lisp의 산술 연산자는 가변(또는 n-ary)이며, 임의의 수의 인수를 취할 수 있습니다.

람다 식 및 함수 정의

LFE는 일반 리스프와 마찬가지로 람다를 가지고 있습니다.단, 어나니머스 함수 호출에서의 Erlang 패턴 매칭 기능을 설명하기 위한 lambda-match도 있습니다.

LFE의 얼랑어 관용구

이 섹션에서는 Erlang과 LFE의 완전한 비교를 나타내는 것은 아닙니다.다만, 어느쪽인가를 설명합니다.

패턴 매칭

Erlang:

      1> {,상황,메시지} = {8,네 알겠습니다,'트릴리언'}.       {8,네 알겠습니다,'트릴리언'}       2> 메시지.       '트릴리언' 

LFE:

      > (세트 (태플  상황 메시지) #(8 네 알겠습니다 '트릴리언'))       #(8 네 알겠습니다 '트릴리언')       > 메시지       '트릴리언' 

일람표

Erlang:

      1> [트렁크(수학:전원(3,X))    X <-> [0,1,2,3]].       [1,3,9,27] 

LFE:

      > (일람표           ((<-> x '(0 1 2 3)))           (트렁크 (연산: pow 3 x)))       (1 3 9 27) 

또는 관용적인 기능 스타일:

      > (목록: 맵           (람다 (x) (트렁크 (연산: pow 3 x)))           '(0 1 2 3))       (1 3 9 27) 

근위대

Erlang:

      right_number(오른쪽 번호)(X) 언제 X == 42; X == 276709 ->         진실의;       right_number(오른쪽 번호)(_) ->         거짓의. 

LFE:

      (삭제하다 오른쪽 번호?         ((x) (언제 (오렌즈 (== x 42) (== x 276709)))           '진짜')         ((_) false(거짓말)) 

함수 헤드에서 고려

Erlang:

      (L) -> (L,0).       ([], ) -> ;       ([H T], ) -> (T, H+). 

LFE:

      (삭제하다  (l) ( l 0))       (삭제하다          (('() ) )         (((단점 h t) ) ( t (+ h )))) 

또는 컨스트럭터 형식 대신 "consetrial"을 사용합니다.

      (삭제하다  (l) ( l 0))       (삭제하다          (('() ) )         ((`(,h . ,t) ) ( t (+ h )))) 

기능 헤드의 레코드 일치

Erlang:

handle_info(ping을 실행하다, #스테이트 {remote_pid = 정의되어 있지 않다} = ) ->     gen_server:출연자들(자신(), ping을 실행하다),     {반응하지 않다, }; handle_info(ping을 실행하다, ) ->     {반응하지 않다, }; 

LFE:

(삭제하다 handle_info   ((ping (= (일치 상태 리모트 pid '오디오') ))     (gen_server: 캐스트 (자신) ping)     `#(반응하지 않다 ,))   ((ping )    `#(반응하지 않다 ,))) 

메시지 수신

Erlang:

      유니버설 서버() ->           받다               {되세요, 펑크} ->                   펑크()           끝.. 

LFE:

      (삭제하다 유니버설 서버 ()         (받다           ((태플 '오디오' 기능하다)            (펑콜 기능하다)))) 

또는 다음과 같이 입력합니다.

      (삭제하다 유니버설 서버 ()         (받다           (`#(되세요 ,기능하다)             (펑콜 기능하다)))) 

Erlang 상호 운용성

Erlang 함수에 대한 콜은 형식(<module>:<function> <function1> ... <argn>:

(io: 포맷 "안녕, 월드!") 

기능 패러다임

재귀를 사용하여 Ackermann 함수를 정의하는 방법:

(삭제하다 아케만   ((0 n) (+ n 1))   ((m 0) (아케만 (- m 1) 1))   ((m n) (아케만 (- m 1) (아케만 m (- n 1))))) 

구성 기능:

(삭제하다 작곡하다 (f g)   (람다 (x)    (펑콜 f      (펑콜 g x))))  (삭제하다 확인. ()   (렛* ((신아신 (작곡하다 #'죄/1 #'asin/1))          (기대됩니다 ( (asin 0.5)))          (합성 결과 (펑콜 신아신 0.5)))     (io: 포맷 "예상 답변: ~p~n" (목록. 기대됩니다))     (io: 포맷 "작성 응답: ~p~n" (목록. 합성 결과)))) 

동시성

Erlang의 경량 '프로세스'를 통한 메시지 전달:

(디모듈 메신저백  (수출. (인쇄 결과 0) (송신 메시지 2)))  (삭제하다 인쇄 결과 ()   (받다     ((태플 pid 메시지)       (io: 포맷 "수신된 메시지: '~s'~n" (목록. 메시지))       (io: 포맷 "처리를 위해 메시지 보내기 ~p...~n" (목록. pid))       (! pid (태플 메시지))       (인쇄 결과))))  (삭제하다 송신 메시지 (calling-pid. 메시지)   (허락하다 ((산란된 pid (낳다 '백백' 인쇄 결과 ())))     (! 산란된 pid (태플 calling-pid. 메시지)))) 

여러 개의 동시 HTTP 요청:

(삭제하다 구문 분석 (깃발)   "하나 이상의 명령줄 인수를 지정하면 전달된 값을 추출합니다.  예를 들어 명령줄을 통해 다음이 전달된 경우:  $erl - my-value - 1 - my-value - 2  그런 다음 다음 함수를 호출하여 LFE 프로그램에서 추출할 수 있습니다.  (리츠(리츠(리츠-리츠 'my-relays)') ... ) 이 예에서는 arg 변수에 할당된 값이 리스트가 됩니다. my-value-1 및 my-value-2 값을 포함합니다."   (허락하다 ((`#(네 알겠습니다 ,데이터.) (init: get_module 깃발)))     (목록: 개요 데이터.)))  (삭제하다 페이지 가져오기 ()   인수 없이 'url 파라미터가 명령줄 경유로 전달되었습니다'라고 가정합니다.   (허락하다 ((URL (구문 분석 'url')))     (페이지 가져오기 URL)))  (삭제하다 페이지 가져오기 (URL)   "inet을 시작하고 (가능성이 있는) HTTP 요청을 작성합니다."   (inet: 시작)   (플레이스트: 맵     (람다 (x)       (호출하다 x)) URL))  (삭제하다 호출하다 (url)   "단일 HTTP 요청을 만듭니다."   (렛* ((방법 '가져오다)          (머리글 '())          (요구 데이터 `#(,url ,머리글))          (http-displaced(http-displaces) ())          (리퀘스트 리퀘스트 리퀘스트 리퀘스트 리퀘스트 '(#(동기 거짓의))))     (httpc: 요구 방법 요구 데이터 http-displaced(http-displaces) 리퀘스트 리퀘스트 리퀘스트 리퀘스트 리퀘스트)     (받다       (`#(http #(,요구 ID #(에러 ,이유)))        (io: 포맷 "오류: ~p~n" `(,이유)))       (`#(http #(,요구 ID ,결과))        (io: 포맷 "결과: ~p~n" `(,결과)))))) 

레퍼런스

  1. ^ Virding, Robert. "Lisp Flavored Erlang" (PDF). Erlang Factory. Retrieved 2014-01-17.
  2. ^ a b c "LFE History on the Lisp Flavored Erlang mail list". Retrieved 2014-05-28.
  3. ^ "LFE announcement on Erlang Questions mail list". Retrieved 2014-01-17.
  4. ^ a b Armstrong, Joe; Virding, Robert (2013-12-30). "Hardware used in the development of Erlang and LFE" (Email exchange). Interviewed by Duncan McGreggor. Retrieved 2014-01-17.
  5. ^ "Follow-up to LFE announcement on Erlang Questions mail list". Retrieved 2014-01-17.

외부 링크