특별한 형태가 아닌 적절한 기능이 될 수 있습니다.
-
19-09-2019 - |
문제
나는 마침내 기능 언어 (EMACS LISP)를 배우기 시작했으며 함수와 플로우 제어와 같은 특수 형태를 명시 적으로 구분합니다.
특수 양식이 기능과 구별되는 기본/이론적 이유가 있습니까? 모든 언어가 기능을 제공하십시오 if
?
감사
해결책
열망하는 평가를 통해 구별이 필요합니다. 게으른 평가가있는 언어 (예 : Haskell) If et al. 기능이 될 수 있습니다.
열망 평가 : 기능의 주장이 평가됩니다 ~ 전에 함수를 호출하면 결과 만 함수로 전달됩니다.
게으른 평가 : 기능의 주장은 액세스 할 경우에만 평가되었습니다.
다른 팁
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에서와 같이 콜 별 의미를 가진 기능적 언어 (게으른 평가)가있는 기능이 될 수 있습니다. 사실, 나는 튜링 머신 및 람다 미적분학 컴퓨팅과 동등한 기초로. 그러나 부작용이있는 언어 (변수에 대한 할당과 같은)에서는별로 사용되지 않습니다. 언제 일이 일어나는 것이 중요합니다.