펙스프루

Fexpr

리스프 프로그래밍 언어에서 fexpr은 피연산자가 평가되지 않고 피연산자로 전달되는 함수입니다.fexpr이 호출되면 fexpr의 본문만 평가되며 fexpr에 의해 명시적으로 시작된 경우를 제외하고 다른 평가는 수행되지 않습니다.한편, 통상의 리스프 함수를 호출하면 오퍼랜드가 자동적으로 평가되고, 이러한 평가의 결과만이 함수에 제공되며, (기존의) 리스프 매크로를 호출하면 오퍼랜드가 비밸류화되지만, 매크로 함수가 반환하는 결과가 무엇이든 자동적으로 평가된다.

"fexpr" 이름의 유래

초기 Lisp에서 환경은 각 기호를 [1]값에 직접 매핑하지 않고 연결 목록에 매핑했습니다.이러한 목록의 표준 키에는 데이터 값을 저장하는 데 사용되는 두 개의 키가 포함되어 있습니다. 이 키는 기호가 인수로 발생할 때 검색됩니다( ).APVALAPVAL1) 및 연산자로서 기호가 발생했을 때 조회되는 함수를 저장하는 데 사용되는 4개의 키.함수 키 중 SUBR은 피연산자가 평가되어 전달된 컴파일된 통상 함수를 나타내고, FSUBR은 피연산자가 평가되지 않은 컴파일된 특수 형식을 나타내며, EXPR은 사용자 정의 통상 함수를 나타내며, FEXPR은 사용자 정의 특수 형식을 나타냅니다.FEXPR과 EXPR의 유일한 차이점은 피연산자가 자동으로 평가되는지 여부였습니다.

따라서 엄밀하게는 FEXPR은 오퍼랜드가 검증되지 않고 전달되는 사용자 정의 함수입니다.그러나 나중에 사용하는 경우 fexpr이라는 용어는 피연산자가 원시인지 사용자 [2]정의인지에 관계없이 해당 피연산자가 값 없이 전달되는 모든 퍼스트 클래스 함수를 나타낼 수 있습니다.

열쇠 상점들 정의자 기능/특수 양식
액세스 포인트 data 값
APVAL 1 data 값
서브러 기능. 시스템. 기능.
FSUBR 기능. 시스템. 특수 형식의
EXPR 기능. 유저 기능.
FEXPR 기능. 유저 특수 형식의

fexprs가 어떻게 동작하는지에 대한 간단한 예로서 커널 프로그래밍 언어로 작성된 fexpr 정의를 소개합니다.이것은 Scheme와 유사합니다.(커널의 규칙에 따르면 fexprs 이름은 항상 $로 시작합니다.

($140! f달러    ($vau (x y z) e       ($if (>=? (평가하다x e) 0)            (평가하다y e)            (평가하다z e)))) 

이 정의에서는 $f라고 하는 fexpr을 제공합니다.이것은 3개의 오퍼랜드를 필요로 합니다.fexpr이 호출되면 fexpr이 정의된 정적 환경을 확장하여 로컬 환경이 생성됩니다.다음으로 로컬바인딩이 생성됩니다.심볼 x, y z는 fexpr에 대한 콜의 3개의 오퍼랜드에 바인드되며, 심볼e는 fexpr이 호출되는 다이내믹 환경에 바인드됩니다.다음으로 이 로컬 환경에서 fexpr 본문($if...)이 평가되고 그 평가 결과가 fexpr에 대한 콜의 결과가 됩니다.순효과는 첫 번째 피연산자가 동적 환경에서 평가되며, 평가 결과가 음이 아닌지에 따라 두 번째 또는 세 번째 피연산자가 평가되고 그 결과가 반환된다.세 번째 또는 두 번째 피연산자는 평가되지 않습니다.

이 예에서는 정적으로 범위가 지정됩니다.로컬 환경은 정적인 환경의 확장입니다.1980년 이전에는 fexprs를 지원하는 리스프 언어가 주로 동적으로 적용되었습니다.로컬 환경은 정적 [3]환경이 아닌 동적 환경의 확장이었습니다.단, 로컬 파라미터 이름이 [4]캡처되지 않도록 동적 환경에 로컬 이름을 제공해야 하는 경우가 있습니다.

주류 사용 및 폐지

Fexpr은 여러 언어로 [5]단편화되기 전에 리스프의 마지막 실질적으로 표준적인 방언인 리스프 1.5에서 계속 지원되었습니다.1970년대에는 두 가지 주요 리스프[6] 언어인 MacLispInterlisp가 모두 fexpr을 [7]지원했습니다.

1980년 리스프와 함수 프로그래밍에 관한 회의에서 Kent Pitman은 매크로와 펙스프르의 장점과 단점을 논의한 논문 "리스프의 특수 형식"을 발표했고, 결국 펙스프르를 비난했다.그의 주된 반대는 fexprs를 허용하는 리스프 방언에서 정적 분석은 연산자가 일반적인 함수를 나타내는지 fexpr을 나타내는지 여부를 일반적으로 결정할 수 없다는 것이다. 따라서 정적 분석은 피연산자가 평가될지 여부를 결정할 수 없다.특히 하위 표현식은 런타임에 가치가 없는 데이터로 취급될 수 있기 때문에 컴파일러는 하위 표현이 안전하게 최적화될 수 있는지 여부를 알 수 없습니다.

MACRO는 특수한 형식의 정의를 지정하기 위한 적절한 메커니즘을 제공합니다.FEXPR은 그렇지 않다.미래의 리스프 방언 설계에서는 FEXPR을 언어에서 완전히 [8]제외해야 한다는 명제를 진지하게 고려해야 한다.

MacLisp와 Interlisp가 쇠퇴한 이후 1993년까지[9] 우세해진 2개의 리스프 언어(Scheme와 Common Lisp)는 fexprs를 지원하지 않습니다.newLISP는 fexprs를 지원하지만 "macros"라고 부릅니다.Picolisp에서 내장된 함수는 모두 fsubrs이며, 리스프 수준의 함수는 exprs, fexprs 또는 이들의 혼합입니다.

1980년 이후 Fexprs

1982년 Brian Smith의 3-Lisp를 시작으로, 컴퓨터 반사의 한계를 탐구하기 위해 몇 가지 실험적인 Lisp 사투리가 고안되었다.리플렉션을 지원하기 위해 이들 Lisps는 콜과 관련된 다양한 데이터 구조를 재구성할 수 있는 프로시저를 지원합니다.이러한 프로시저는 fexprs가 됩니다.1990년대 후반까지 펙스프르는 주로 계산 [10]반사와 관련되었다.

fexprs에 대한 몇 가지 이론적 결과를 얻었다.1993년, 존 C.Mitchell은 소스 표현이 공식적으로 추상화될 수 없는 프로그래밍 언어의 예로서 Lisp와 fexprs를 사용했다(소스 표현의 구체적인 구문은 항상 fexpr의 [11]피연산자인 컨텍스트에 의해 추출될 수 있기 때문이다).1998년 Mitchell Wand람다 미적분에 펙스프르 장치를 추가하는 것(피연산자의 재작성을 억제하는 장치)을 추가하면 사소한 등식 이론으로 정식 시스템이 생성되므로 전체 프로그램 [10]분석 없이 소스 대 소스 최적화가 불가능하다는 것을 보여주었다.2007년, John N.Shutt는 wand의 [12]결과를 피하기 위해 피연산자의 재작성을 억제하지 않고 fexprs를 모델링하는 람다 미적분의 확장을 제안했다.

「 」를 참조해 주세요.

다음 언어는 fexprs 또는 그에 준하는 기능을 구현합니다.

  • ECL 프로그래밍 언어는 파라미터 유형("바인드 클래스")을 제공합니다.UNEVAL인수식의 구문 트리가 파라미터에 바인드되도록 지정합니다.
  • io, 메서드(블록)는 Introspection을 사용할 수 있습니다.call콜 전체를 참조해, 조작합니다.io의 콜슬롯과 셀프슬롯을 참조해 주세요.
  • 커널 사용$vaufexpr을 만드는 방법처럼lambda는 Scheme에 함수를 만듭니다.
  • newLISP 사용define-macrofexpr을 정의합니다."Fexpr 매크로매크로 다시 쓰기" 섹션을 참조하십시오.
  • PicoLisp에서는(de foo X ...)fexpr의 정의foo부르면 결속된다는 것.X논증 표현 목록으로 이동합니다."Evaluation in PicoLisp"를 참조하십시오.
  • R 파라미터는 일반적으로 약속(평가느림) 및 콜에 바인드됩니다.substitute(param)파라미터에 대해서는 R의 치환을 참조해 주세요.
  • REBOL에서는 평가되지 않는 인수식은 발신자가 블록(대괄호)으로 감싸야 합니다.즉, 인수 평가를 방해하는 착신자는 정의할 수 없습니다.예시와 함께 이 문서를 참조하십시오.그런 의미에서 REBOL에는 fexprs가 없습니다.사용의 일부를 에뮬레이트 하는 것이 용이할 뿐입니다.진정한 fexprs를 사용하는 언어에서는 fexpr 콜은 일반 함수 콜과 비슷합니다.한편, REBOL 에서는, 인수가 평가되지 않는 콜은, 통상의 함수 콜과 항상 다르게 보입니다.

각주

  1. ^ 매카시 외, 리스프 I 프로그래머 매뉴얼, 88~91페이지.
  2. ^ Pitman, 개정판 MacLisp 설명서, 75페이지.
  3. ^ 스틸과 가브리엘, "리스프의 진화", 페이지 239-240.
  4. ^ Pitman, 개정된 MacLisp 설명서, 페이지 62
  5. ^ 스틸과 가브리엘, "리스프의 진화", 231-232페이지.
  6. ^ 스틸과 가브리엘, "리스프의 진화", 235페이지
  7. ^ Pitman, 개정판 MacLisp 매뉴얼, 페이지 182.
  8. ^ 피트만, "리스프의 특수 양식", 페이지 179.
  9. ^ 스틸과 가브리엘, "리스프의 진화", 245-248페이지
  10. ^ a b Wand, "Fexprs 이론은 사소한 것이다", 189페이지.
  11. ^ 미첼, "프로그래밍 언어의 추상화와 표현력에 대하여", 섹션 7.
  12. ^ Shutt, "vau-calculi와 fexprs 이론"

레퍼런스

  • McCarthy, J.; Brayton, R.; Edwards, D.; Fox, P.; Hodes, L.; Luckham, D.; Maling, K.; Park, D.; Russell, S. (March 1960), LISP I Programmers Manual (PDF), Boston, Massachusetts: Artificial Intelligence Group, M.I.T. Computation Center and Research Laboratory 2010년 5월 11일에 액세스.
  • John C. Mitchell, "프로그래밍 언어의 추상화와 표현력에 대하여", 컴퓨터 프로그래밍 과학 212(1993), 페이지 141-163. (Symp의 논문 특별호)이론. 컴퓨터 소프트웨어의 측면, 일본 센다이, 1991년)2008년 1월 24일에 액세스.
  • Kent M. Pitman, "리스프의 특수 양식", 1980년 리스프와 함수 프로그래밍에 관한 ACM 회의의 진행, 1980, 페이지 179–187.2008년 1월 25일에 액세스.
  • Kent M. Pitman, 개정판 MacLisp 매뉴얼(토요일 저녁판), MIT 컴퓨터 과학 연구소 기술 보고서 295, 1983년 5월 21일.
  • John N. Shutt, "vau-calculi and theory of fexprs", 토크, 뉴잉글랜드 프로그래밍 언어시스템 심포지엄 시리즈(NEPLS), 2007년 10월 18일.2008년 1월 27일 추상 액세스.
  • 가이 L. 스틸과 리처드 P. 가브리엘, "리스프의 진화", ACM SIGPLAN Notice 28 no. 3 (1993년 3월), 페이지 231–270.
  • 미첼 완드, "Fexprs 이론은 사소한", 리스프와 심볼릭 계산 10 no.3(1998년 5월), 페이지 189–199.2008년 1월 25일에 액세스.