나는 신입이다. 나는 곧 시험, 시험 언어 체계를 가지게되며 준비하고 있습니다.
몇 시간 동안 해결하려고하지만 시작하는 방법도 이해하지 못하는 질문이 있습니다.
질문은 다음과 같습니다.
이 형식의 새로운 표현이 있습니다.
(get-procedure-body <exp>)
이 식은 단일 식을 인수로 받아 평가하고 사용자 프로 시저 유형 값을 얻으면 Her 본문을 반환합니다.
계획 언어의 질문
안녕하세요 여러분, 여기 새로 왔어요. 곧 시험이 있고 언어 시험이 있고 준비 중입니다. 몇 시간 동안 해결하려고하지만 시작하는 방법도 이해하지 못하는 질문이 있습니다.
질문은 다음과 같습니다.이 형식의 새로운 표현이 있습니다.
이 식은 단일 식을 인수로 받아 평가하고 사용자 프로 시저 유형 값을 얻으면 Her 본문을 반환합니다.
다음은 재평가 후 가능한 경우입니다.
기능 작동의 가능한 출력 :
(get-procedure-body f)
> ((display x) (* x y))
(get-procedure-body (lambda (x) (h x)) )
> ((h x))
(get-procedure-body +)
> “primitive! Implementation hidden”
(get-procedure-body 1)
> “error: non-procedure”
(get-procedure-body (+ 1 1))
> “error: non-procedure”
질문은 다음과 같습니다.
body-procedure-get 표현식에 대한 지원을 커널 표현식으로 추가 (필요한 모든 변경 사항 작성)
누군가가 적어도 나를 도울 수 있다면 기쁠 것입니다. 나는 나 자신을 설명하려고 노력했습니다. 명확하지 않은 것이 있으면 더 설명하겠습니다. 이것은 특히 많은 지원이 없기 때문에 어려운 언어입니다.
나는 무엇을해야할지조차 알 수 없었다.
프로 시저의 본문을 가져 오는 것은 Scheme의 일부가 아니며 Common Lisp 표준이 아닙니다. 그러나 eval
사용자 프로 시저를 지원 하는 Scheme 인터프리터 ( )를 만든 경우 선택한 데이터 구조에 문제의 코드가 있고 비표준으로 만들 가능성이 높습니다. 프리미티브 get-procedure-body
는 호스트 언어에서 동일한 절차를 노출합니다. 예 : SICP 책에는 통역사의 일부로 매우 유사한 이름이 있습니다.
Racket 사용에 관해서는 한 번 비슷한 일을 할 수 있도록 만들었습니다.
#lang racket
(struct proc (src obj)
#:property prop:procedure
(struct-field-index obj)
#:transparent
#:methods gen:custom-write
[(define (write-proc x port mode)
((case mode
[(#t) write]
[(#f) display]
[else pretty-print])
(proc-src x)
port))])
(define-syntax lambda*
(syntax-rules ()
((_ . rest)
(proc '(lambda* . rest) (lambda . rest)))))
(define test (lambda* (x y) (+ x y)))
test ; ==> #(struct:closure (lambda* (x y) (+ x y)) #<procedure>)
(proc-src test) ; ==> (lambda* (x y) (+ x y))
(proc-obj test) ; ==> #<procedure>
((proc-obj test) 1 2) ; ==> 3
(test 1 2) ; ==> 3
이제이 솔루션은 문제를 거꾸로 뒤집습니다. 시스템에서 소스를 가져올 방법이 없기 때문에 프로 시저 개체와 함께 소스를 저장하는 구문을 만들고 구조체 기능을 사용하여 패키지화합니다. 절차 는 introspection을 제외하고는 lambda*
동일하게 작동합니다 lambda
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다