2016-09-08 6 views
4

Есть ли способ получить список signature s или structure s, доступных в среде верхнего уровня из SML/NJ REPL? Я ищу, чтобы получить список сигнатур/структур, которые, как представляется, определены в файлах sources.cm в каталоге источника sml. Что-то вроде линийЗапросить SML/NJ REPL для подписей или структур?

- signature s = LIST; 

только перечисление привязок в среде верхнего уровня.

ответ

5

Вы можете использовать internal structures что SML/NJ обеспечивает:

fun boundSignatures() = 
    let 
    fun isSignature symbol = Symbol.nameSpace symbol = Symbol.SIGspace 
    val signatures = List.filter isSignature (EnvRef.listBoundSymbols()) 
    in 
    List.app (fn s => print (Symbol.name s^"\n")) signatures 
    end 

Пожалуйста, обратите внимание, что из-за автозагрузку, EnvRef.listBoundSymbols не будет возвращать символьные имена для модулей, которые доступны, но еще не были загружены:

- boundSignatures(); 
ENVREF 
val it =() : unit 
- signature S = STATICENV; 
[autoloading] 
[autoloading done] 
- boundSignatures(); 
STATICENV 
ENVREF 
S 
val it =() : unit 
+0

работает отлично, спасибо. Чтобы заставить автозагрузку, я обнаружил, что могу называть 'CM.make (" $/basis.cm ")', чтобы заставить базовые значения добавляться. – jenesaisquoi

+0

@jenesaisquoi спасибо, я этого не знал. BTW, круглые скобки являются избыточными в этом вызове: 'CM.make '$/basis.cm" '. В SML вам нужны только скобки, когда вам нужно явно указать ассоциативность. они не используются в качестве синтаксиса для вызовов функций. Для обозначения вызовов функций используется пробел. –