2013-11-14 5 views
3
(define defun define) 

라켓에 오류가 발생했습니다. define: not allowed in an expression context in: define. define, let, lambda과 같은 기본 구문에 대한 별칭을 만드는 방법은 무엇입니까?키워드 별명

답변

4

define은 1 급 개체가 아닌 구문입니다. 객체로 참조 할 수는 없습니다.

저스틴이 말했듯이 매크로를 만들 수 있습니다. 그러나 리스프 스타일 defun이 제도 스타일 define에 다른 구문을 가지고 있으며, 매크로 계정에이 소요됩니다 참고 : 정상적인 절차와

(define-syntax-rule (defun name params body ...) 
    (define (name . params) 
    body ...)) 
1

라켓에 대해 명확히 알지 못하지만보다 일반적인 문제는 스키마 define에서 letlambda은 기능이 아니라 구문 및/또는 특수 형식입니다. 따라서 함수로 정의 된 경우 표현식 컨텍스트에서 참조 할 수 없습니다.

대신에 define 표현식으로 확장되는 defun 매크로를 정의 할 수 있습니다.

1

을 당신과 함께 별칭을 정의 할 수 있습니다 :

(define first car) ; first isn't defined in R[67]RS 

그러나 definedefun은 호환되지 않습니다. 이 매크로는 커먼 리스프에서와 같이 작동하는 글로벌 defun 것 : 계획에서

#!r6rs 
(import (rnrs base)) 

(define-syntax defun 
    (syntax-rules() 
    ((defun name args . body) 
    (define (name . args) . body)))) 

define 대부분 때문에 제도의 한 네임 스페이스 특성, defun보다 더 많은 모자를 가지고있다. definelabels, flet, defconstantsetq으로 작동합니다 (단, 이전에 바인딩 한 경우 set!을 업데이트해야 함).