Как проверить, ожидает ли stdin в TCL? - PullRequest
1 голос
/ 06 января 2012

Рассмотрим следующий код:

chan configure stdin -blocking false
while { true } {
    chan gets stdin
    if { chan blocked stdin } { break }
}

Здесь, в последней строке цикла chan blocked stdin возвращает true в обоих случаях: когда больше нет входных данных, доступных на stdin, и когда есть какие-то входные данные, доступные на stdin, но это не так конец символом новой строки. Мне нужно различить эти два случая.

Как я могу это сделать?

chan pending input stdin также возвращает 0 в обоих случаях.


Вот контекст, в котором используется вышеуказанный код.

proc prompt { } { puts -nonewline stdout "MyShell > "; flush stdout }

proc evaluate { } \
{
    chan configure stdin -blocking false
    while { true } {
        # for "stdin -blocking false" "read stdin" acts like "gets stdin"
        set part [chan read stdin 100]
        append command $part
        if { $part eq "" } { break }
    }
    chan configure stdin -blocking true
    # Here I want test if there are pending characters at stdin,
    # and while so, I want to wait for newline character.
    # It should be like this:
    # while { *the required test goes here* } {
    #    append command [chan gets stdin]\n
    # }
    while { ! [info complete $command] } { 
        append command [chan gets stdin]\n
    }
    catch { uplevel #0 $command } got
    if { $got ne "" } {
        puts stderr $got
        flush stderr
    }
    prompt
}

chan event stdin readable evaluate 
prompt
while { true } { update; after 100 }

1 Ответ

2 голосов
/ 06 января 2012

Запуск интерактивного командного интерпретатора с циклом событий вполне возможен, и он подробно описан в вики Tcler. Однако, если вы действительно просто запускаете команды Tcl, вам следует подумать об использовании команды commandloop из пакета TclX , так как он позаботится о деталях.

...