Могут ли объекты TclOO быть общими / псевдонимами между интерпретаторами? - PullRequest
1 голос
/ 22 марта 2020

Я внедряю обработку DSL. Я использую безопасный интерпретатор для source входного файла.

В процессе обработки я создаю объект.

что-то вроде:

set interp [interp create -safe]
interp expose $interp source
interp eval $interp {
    oo::class create Graph { # ...
    }

    # add domain-specific commands here
    proc graph {definition} {
        global graph
        $graph add $definition
    }
    # and so on

    set graph [Graph new]
}
interp eval $interp source $graphFile

Есть ли механизм для псевдонима объекта $graph в основном интерпретаторе?

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

Псевдонимы - это команды, а не объекты. Однако для вызова (в отличие от изменения определений или создания подклассов и т. Д. c.) Вы можете установить псевдоним, указывающий на объект в другом интерпретаторе:

oo::class create Example {
    variable count
    method bar {} { return "this is [self] in the method bar, call [incr count]" }
}
Example create foo

interp create xyz
interp alias xyz foo {} foo

xyz eval {
    puts [foo bar]
}
# this is ::foo in the method bar, call 1

Отдельные методы также могут go между интерпретаторами (с некоторыми ограничениями), если вы forward вызываете метод для псевдонима, который пересекает границу интерпретатора. Это позволяет для всех видов махинаций.

oo::class create Example {
    variable count
    method bar {caller} { return "this is $caller in the method bar, call [incr count]" }
}
Example create foo

interp create xyz
interp alias xyz _magic_cmd_ {} foo bar
interp eval xyz {
    oo::class create Example {
        forward bar _magic_cmd_ pqr
    }
    Example create grill
    grill bar
}
# this is pqr in the method bar, call 1
0 голосов
/ 23 марта 2020

Чем я закончил:

oo::class create Graph { # ...
}
set graph [Graph new]

set interp [interp create -safe]

interp expose $interp source
interp alias $interp graphObj {} $graph

interp eval $interp {
    # add domain-specific commands here
    proc graph {definition} {
        graphObj add $definition
    }
    # and so on
}

interp eval $interp source $graphFile

puts [$graph someMethod]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...