2012-01-06 3 views
1

Рассмотрим следующий код:Как проверить, ожидает ли stdin в TCL?

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

Здесь, в последней строке цикла chan blocked stdin возвращает истину либо в случаях: когда нет более вход доступен в 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 } 
+0

Что вы действительно пытаетесь сделать? Прочитать символ по символу при нажатии клавиши? На какой платформе это нужно? – slebetman

+0

Я пытаюсь написать оболочку, похожую на 'tslsh'. Вышеупомянутый код обрабатывает ввод, введенный в оболочку. Если вход заканчивается символом новой строки, то оболочка должна попытаться его оценить, а в противном случае, т. Е. Если на входе есть ожидающие символы, тогда оболочке придется ждать символа новой строки. – Vahagn

+0

@slebetman См. Обновление. – Vahagn

ответ

2

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

Смежные вопросы