Источник из строки - PullRequest
       5

Источник из строки

0 голосов
/ 29 ноября 2018

Как получить источник из строки, а не из файла

Так мы обычно получаем файл

// somename.tcl
proc someName {} {
    # The {} above means a list of zero formal arguments
    puts "Hello from inside someName"
}

Я могу получить его из любого другого файла tcl в следующемway

//main.tcl
source "somename.tcl"

//call someName 
someName

Вместо вышеупомянутого я хотел бы прочитать содержимое somename.tcl в строку и получить исходную строку.Я хочу, чтобы содержимое строки было получено в том же контексте процесса.

Как показано ниже

//main.tcl 
set filename "somename.tcl" 
set f [open $filename] 
set content [read $f]

# I want to source the content here
#How do i do it?

1 Ответ

0 голосов
/ 29 ноября 2018

Команда source делает что-то очень как это внутренне:

# Reading phase
set f [open $filename]
try {
    fconfigure $f -encoding $encoding -eofchar "\032"
    set contents [read $f]
} finally {
    close $f
}

# Evaluation phase
set oldScript [info script]
try {
    info script $filename
    eval $contents
} finally {
    info script $oldScript
}

, где $encoding по умолчанию соответствует тому, что [encoding system] сообщает.За исключением того, что он делает это в C и имеет некоторые дополнительные сложности для простого разбора аргументов, и имеет несколько иную обработку ошибок в отношении трассировки стека.

В простом случае вы можете преобразовать это в:

set f [open $filename]
set contents [read $f]
close $f
eval $contents

Команда eval является ключевой здесь: она eval использует сценарий Tcl в строке.Это не очень часто используется в современном Tcl, но для чего-то подобного это предпочтительная команда.


Если вы помещаете код в процедуру, вам нужно изменить eval на uplevel 1 иметь правильную семантику;source не не меняет кадр стека для вас:

proc simpleSource {filename} {
    set f [open $filename]
    set contents [read $f]
    close $f

    uplevel 1 $contents
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...