Ошибка при использовании структуры HashTable в файлах, используемых в файле CM.

Я использую файл CM «build.cm» для компиляции своих файлов SML. В файлеsymbol_table.sml я использовал структуру HashTable из базовой библиотеки sml. При запуске файла CM я получаю сообщение об ошибке, в котором говорится, что HashTable является неограниченной структурой.

символ_таблица.sml

      
signature SYMTABLE =
sig
val table : (string,Rational.rational) HashTable.hash_table ;
val add_entry : string * Rational.rational -> unit ;
val lookup_entry : string -> Rational.rational
end ;

structure SymTable : SYMTABLE  =
struct
open Rational ; 
open HashTable ; 
(* raised when I do a lookup and can't find something *)
exception lookup_error

val hash_fn : string->word = HashString.hashString

fun cmp_fn(x : string ,y : string) = (x = y)


val init_sz : int = 101

val table: (string,rational) hash_table = mkTable (hash_fn, cmp_fn)(init_sz, lookup_error)
fun add_entry(key, value) = insert table (key,value) ;
fun lookup_entry(key) = lookup table key ;

end ;

строй.см

      Library 
    structure compile
is 
    $/basis.cm 
    $/ml-yacc-lib.cm 
    $/smlnj-lib.cm
    $smlnj/compiler/compiler.cm

    bigint.sml
    rational.sml
    symbol_table.sml 
    calc.lex 
    calc.yacc: MLYacc
    glue.sml 
    compiler.sml

сообщение об ошибке -

      Standard ML of New Jersey v110.79 [built: Sat Oct 26 12:27:04 2019]
- CM.make "build.cm" ;
[autoloading]
[library $smlnj/cm/cm.cm is stable]
[library $smlnj/internal/cm-sig-lib.cm is stable]
[library $/pgraph.cm is stable]
[library $smlnj/internal/srcpath-lib.cm is stable]
[library $SMLNJ-BASIS/basis.cm is stable]
[library $SMLNJ-BASIS/(basis.cm):basis-common.cm is stable]
[autoloading done]
[scanning build.cm]
[parsing (build.cm):symbol_table.sml]
[attempting to load plugin $/lex-ext.cm]
[library $/lex-ext.cm is stable]
[library $smlnj/cm/tools.cm is stable]
[library $smlnj/internal/cm-lib.cm is stable]
[plugin $/lex-ext.cm loaded successfully]
[attempting to load plugin $/mllex-tool.cm]
[library $/mllex-tool.cm is stable]
[plugin $/mllex-tool.cm loaded successfully]
[attempting to load plugin $/mlyacc-tool.cm]
[library $/mlyacc-tool.cm is stable]
[plugin $/mlyacc-tool.cm loaded successfully]
[library $/ml-yacc-lib.cm is stable]
[library $smlnj/compiler/compiler.cm is stable]
[library $SMLNJ-ML-YACC-LIB/ml-yacc-lib.cm is stable]
[loading (build.cm):bigint.sml]
[loading (build.cm):rational.sml]
[compiling (build.cm):symbol_table.sml]
symbol_table.sml:6.43-6.63 Error: unbound structure: HashTable in path HashTable.hash_table
symbol_table.sml:14.3-14.17 Error: unbound structure: HashTable
val it = false : bool

Rational — это структура, определенная в рациональном.sml, а компиляция — это структура, определенная в compile.sml.

Я просмотрел в Интернете документацию по файлам CM, но не нашел ничего полезного. Кроме того, я новичок в sml, поэтому не могу найти простого способа исправить эту ошибку. У меня также есть первый опыт работы с файлами CM. Любая помощь будет оценена по достоинству.

1 ответ

Это должно сработать. Я внес несколько незначительных упрощающих правок (в основном заменил Rational.rational на int и оставил только «$/smlnj-lib.cm» в файле build.cm), и код примера скомпилировался без ошибок [HashTable находится в библиотеке smlnj-lib, а не библиотека Basis].

Не используйте такие спецификации, как

        $smlnj/compiler/compiler.cm

в файлах описания CM. Обычно это не сработает, по крайней мере, на данный момент.

Очевидным неизвестным в этом вопросе является то, какую версию SML/NJ вы использовали. Я использовал 110.99.3 («устаревшую» версию) и 2022.1 (текущую «разрабатываемую» версию).

Другие вопросы по тегам