2016-09-01 3 views
1

저는 이번 여름부터 라켓에서 장난감 언어를 만들면서 놀았습니다. 모든 양식에는 고정 된 속성이 있으며 기본적으로 괄호가 필요하지 않으므로 적용됩니다. 예. +은 2가 있으므로 + 3 + 4 5(+ 3 (+ 4 5))이고 + + 3 4 5(+ (+ 3 4) 5)입니다.읽기 시간에 모듈에 대한 정보를 얻을 수있는 방법이 있습니까?

이렇게하려면 메인 모듈에 기호와 해당 기호를 저장합니다. 독자는 특수한 형식인지 또는 절차인지는 신경 쓰지 않지만 라켓의 기능을 사용하여이를 수행하는 더 좋은 방법이 있습니까? 따라서 모듈 메타 데이터를 가져 와서 구문 분석하는 대신 쿼리 할 수 ​​있습니까?

+0

안녕하세요. "독자는 그것이 ...인지 아닌지 상관하지 않습니다." "그것"을 말하는 것은 무엇입니까? 메타 데이터 저장은 하위 모듈에서 수행되는 경우가 많지만 (메타 데이터를 어디서 (언제!) 사용해야 할 지 잘 모르겠습니다.) – soegaard

+0

리더에서 @soegaard 기호가 결과 구문의 식별자가됩니다. . 만약 내가 라켓 /베이스에 대한 새로운 문법을 만들었다면, 라켓 /베이스에서 어쨌든 "죄수"를 찾아서 그것을 알 수 있겠습니까? – Sylwester

+0

독자가 독자적으로 작성했거나 내장 된 것을 재사용하고 있습니까? – soegaard

답변

1

여기에서 기호로 이동하는 방법 중 하나입니다.

#lang racket 

(define base-ns (make-base-namespace)) 
(define (symbol->arity s) 
    (parameterize ([current-namespace base-ns]) 
    (procedure-arity (namespace-variable-value s)))) 

(symbol->arity 'cons) 
+2

아주 좋습니다. 만약 내가'racket/list'와 같은 특정 모듈 하나만 살펴 본다면 어떻게 그 네임 스페이스를 만들 수 있을까요? – Sylwester

+0

make-empty-namespace를 사용하여 네임 스페이스를 만듭니다. 그런 다음 namespace-require를 사용하여 모듈을 필요로하십시오. – soegaard

+0

그게 전부지만, 시도했지만 비참하게 실패했다, 나는 (여기에) 발견 (https://docs.racket-lang.org/guide/mk-namespace.html)'make-base-empty-namespace'은 올바른 옵션. 이번 주말처럼 모든 것이 네임 스페이스에 관한 것 같습니다. 감사합니다 :) – Sylwester

관련 문제