2016-09-01 3 views
1

Я с этого лета играл с созданием игрушечного языка в Racket. Каждая форма имеет фиксированную арность и по умолчанию применяется так, чтобы скобки не нужны. например. + имеет arity 2 так + 3 + 4 5 is (+ 3 (+ 4 5)) и + + 3 4 5 is (+ (+ 3 4) 5).Есть ли способ получить информацию о модуле во время чтения?

Для этого я храню в главном модуле символы и их смысл. Читателю все равно, если это специальная форма или процедура, но есть ли лучший способ сделать это, используя функции из рэкета? Таким образом, я могу импортировать метаданные модуля и запрашивать их во время разбора?

+0

Hi. «Читателю все равно, если это ...», о чем идет речь «это»? Хранение метаданных часто выполняется в подмодуле (но я немного не уверен, где (и когда!) Вы хотите использовать метаинформацию. – soegaard

+0

@soegaard символ в читателе, становится идентификатором в результирующем синтаксисе Если бы я должен был создать новый синтаксис для racket/base, могу ли я найти '' cons 'каким-то образом в racket/base, чтобы найти его arity? – 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

Thats, что я пробовал, но это провалилось жалко, однако я нашел [здесь] (https://docs.racket-lang.org/guide/mk-namespace.html), что 'make-base-empty-namespace' будет правильный вариант. Похоже, что в эти выходные будут все про пространства имен. Спасибо :) – Sylwester

Смежные вопросы