2009-09-21 5 views
3

Common Lisp에 익숙하고 Scheme을 익히기 위해 Common Lisp에서 일반적으로 코딩하는 것들에 Scheme을 사용하는 방법을 이해하려고 노력했습니다.변수의 값이 Scheme의 프로 시저에 바인딩 된 심볼인지 어떻게 알 수 있습니까?

Common Lisp에는 기호 (변수 값)가 함수에 바인딩되어 있는지 알려주는 fboundp이 있습니다. 그래서, 나는 이것을 할 것이다 :

(let ((s (read))) 
    (if (fboundp s) 
     (apply (symbol-function s) args) 
     (error ...))) 

Scheme에서 가능한가? 나는 R6RS 사양에서 이것을 찾으려고 노력하고 있었지만 비슷한 것을 찾지 못했다.

답변

5

이렇게하면?

  1. 검사가 상징
  2. 인 경우는 결과가 계획에서, 함수에 연결되지 않은 PROCEDURE?
+1

안녕하세요, 작동합니다! :-) 그리고 결과를 변수 p에 저장 한 후에 "(p ag1 arg2)"처럼 프로 시저로 사용할 수 있습니다. 감사합니다. – Jay

+0

은 CL (SBCL)에서 작동하지 않습니다. 언 바운드 기호에서 _eval_가 호출되면 오류가 발생하기 때문입니다. CL에서는 _boundp_ – dbow

+1

@dbow를 사용해야합니다. 이미 Common Lisp에서 boundp와 fboundp를 사용하고 있다는 질문이 있습니다. 질문은 * Scheme *에서 그렇게하는 방법이었습니다.이 대답은 직접 대답을 – xdavidliu

4

를 갖는 프로 시저 인 경우 그 값

  • 체크를 얻을 수 EVAL를 사용하여 기호를 평가 기호는 Common Lisp에있는 것과 같습니다. 당신이 값이 과정이 실제로 있는지, 알고 싶다면, 당신은 procedure? 술어를 사용할 수 있습니다

    (if (procedure? s) (do-something-with s) (do-something-else)) 
    

    귀하의 예제 코드는 어떻게 원하는 것을 달성하기 위해 휴대용 계획에 직접적인 방법의 상징으로,이 없다 Scheme은 Common Lisp의 value/function/plist 슬롯이 부족한 일종의 통일 된 문자열입니다.

    당신은 뭔가를 시도 할 수 :

    (define function-table (list `(car ,car) `(cdr ,cdr) `(cons ,cons) `(display ,display))) 
    
    (let* ((s (read)) 
         (f (cond ((assq s function-table) => cadr) 
           (else (error "undefined function"))))) 
        (apply f args)) 
    

    즉, "좋은"기능의 자신의 매핑을 정의. 이것은 "안전"한 것만으로 기능 세트를 제한 할 수 있다는 장점이 있습니다.

  • +0

    "이 방법은 기능 집합을"안전한 "것만으로 제한 할 수 있다는 장점이 있습니다." - 네,하지만 아이디어는 사실 모든 기능을 나열하는 것이 아닙니다. 새 것을 쓰면 사용할 수 있습니다. 보안을 위해 이처럼 호출되는 모든 함수가 특정 패키지에 포함되도록 할 수 있습니다. – Jay

    +0

    패키지 (구성표에 있음)? – Dirk

    +0

    @Dirk : Common Lisp에서 의미가 있었어. 나는 Scheme에서 불가능하다고 생각합니다. – Jay