문제

나는 마침내 기능 언어 (EMACS LISP)를 배우기 시작했으며 함수와 플로우 제어와 같은 특수 형태를 명시 적으로 구분합니다.

특수 양식이 기능과 구별되는 기본/이론적 이유가 있습니까? 모든 언어가 기능을 제공하십시오 if?

감사

도움이 되었습니까?

해결책

열망하는 평가를 통해 구별이 필요합니다. 게으른 평가가있는 언어 (예 : Haskell) If et al. 기능이 될 수 있습니다.

열망 평가 : 기능의 주장이 평가됩니다 ~ 전에 함수를 호출하면 결과 만 함수로 전달됩니다.

게으른 평가 : 기능의 주장은 액세스 할 경우에만 평가되었습니다.

다른 팁

만약에 if 정상적인 기능이었고 두 가지 주장이었습니다 그런 다음 형성됩니다 그리고 다른 형태-일 것이다 둘 다 평가됩니다 ~ 전에 전화 if 그것은 규칙이기 때문에 기능 기능 평가: 평가하다 모든 주장 값을 생성하려면 목록의 첫 번째 기호로 지정된 함수에 대한 인수로 해당 값 순서를 제공하십시오.

대신 if 당신이하고 싶은 것은 정확히 하나를 평가하는 것입니다. 그런 다음 형성됩니다 그리고 다른 형태, 둘 다가 아닙니다. 하나 또는 다른 것의 평가를 억제하려면 매크로 또는 특별한 형태.

EMACS LISP 및 일반적인 LISP와 같은 언어에서 특수 양식은 내장 언어 구성입니다. 정상적인 기능이 호출하는 평가 규칙이 다릅니다. 정상 기능 호출의 경우 모든 인수가 평가됩니다. 따라서 IF를 정상 함수로 쓸 수 없습니다. 조건은 어떤 조항을 평가하는지 결정합니다. 또한 일반적으로 자신만의 특수 양식을 작성할 수 없습니다. 공동 LISP 특수 양식을 정의하기위한 언어 구조는 없습니다 (개별 구현은 기존 구현을 어떻게 든 구현해야하지만, 이것은 매크로로 이어집니다. 매크로를 사용하면 구문 변형을 쓸 수 있습니다. 이는 하나의 표현식을 다른 표현으로 변환합니다. 매크로로서 쓸 수 있으려면 변환 된 코드에 사용할 수있는 다른 조건부 양식이 필요합니다. LISP는 조건부를 기본 구성으로 제공합니다. Cond가 기본 구성이라고 가정 해 봅시다. 그런 다음 Cond 사용으로 확장 할 수 있습니다.

my-if common lisp의 매크로 :

(defmacro my-if (condition true-clause false-clause)
   `(cond (,condition ,true-clause)
          (t ,false-clause)))

그래서

(my-if (foo-p) 'one 'two)

확장됩니다

(cond ((foo-p) 'one)
      (t 'two))

완전성 : 피코 예를 들어 언어 및 if 원시입니다 기능 Pico는 체계에서 영감을 얻었으며 기본적으로 열망적인 평가를 받았습니다.

계획에서 당신은 쓸 수 있습니다

(define (true t f)
  (t))

(define (false t f)
  (f))

(define (function_if c t e)
  (c t e))

그리고

(function_if true (lambda () 'true) (lambda () 'false))
==> true

Pico에서 이것을 관리 할 수있는 것은 당신이 정의 할 수 있다는 것입니다. 기능적 매개 변수 "자동으로"지연된 기능적 주장을 취합니다. 이것은 당신이 람다 내부의 포장을 직접 할 필요가 없다는 것을 의미합니다. 따라서 Pico는 열렬한 평가를 가지고 있지만 주문에 대한 게으른 평가를 통해 특별한 형태의 필요성을 우회합니다.

따라서 기능 매개 변수가있는 Scheme Syntax에서 부울을 인코딩 할 수 있습니다.

(define (true (t) (f))
  (t))

(define (false (t) (f))
  (f))

그런 다음 작동하면 기능을 수행합니다.

(define (function_if c (t) (e))
  (c (t) (e)))

그리고

(function_if true 'true 'false)
==> true

또 다른 예로서, 함수의 정의 and ~이다 (define (and p (q)) (p (q) false)).

마찬가지로 정의 할 수 있습니다 or, not, while, for, ... 함수로, 위의 부울 인코딩을 사용하여.

짧은 대답 : 아니요.

Long (er) 답변 : (만약 ...) 인수의 평가 순서를 제어해야합니다. LISP는 열망하는 언어가되는 기능에서 이것을 할 수 없습니다.

해결 방법 : 매크로에서 수행하십시오.

(defmacro _if (cnd true false)
    (let (  (gcond (gensym))
            (gresp (gensym)))
        `(let ( (,gcond ,cnd) ;`#quotes
                (,gresp nil))        
            (and ,gcond       (setf ,gresp (multiple-value-list ,true)))
            (and (not ,gcond) (setf ,gresp (multiple-value-list ,false)))
            (values-list ,gresp))))

예를 들어:

[dsm@localhost:~]$ clisp -q
[1]> (defmacro _if (cnd true false)
    (let (  (gcond (gensym))
            (gresp (gensym)))
        `(let ( (,gcond ,cnd) ;`#quotes
                (,gresp nil))        
            (and ,gcond       (setf ,gresp (multiple-value-list ,true)))
            (and (not ,gcond) (setf ,gresp (multiple-value-list ,false)))
            (values-list ,gresp))))
_IF
[2]> (_if (= 1 1) (+ 2 3) "bar")
5
[3]> (_if (= 1 2) (+ 2 3) "bar")
"bar"
[4]> 

스칼라에서는 모델을 모델링 할 수 있습니다 if 콜 별 인수를 사용하여 올바른 부작용 평가.

def If[A](cond : Boolean, truePart : => A, falsePart : => A) = if (cond) truePart else falsePart

이 기능은 많은 모델을 모델링하는 데 사용할 수 있습니다 새로운 제어 구조 또한.

Lambda 미적분학 또는 Algol에서와 같이 콜 별 의미를 가진 기능적 언어 (게으른 평가)가있는 기능이 될 수 있습니다. 사실, 나는 튜링 머신 및 람다 미적분학 컴퓨팅과 동등한 기초로. 그러나 부작용이있는 언어 (변수에 대한 할당과 같은)에서는별로 사용되지 않습니다. 언제 일이 일어나는 것이 중요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top