2015-10-05 4 views
0

Я знаю функцию stdin.read_line(), но мне хотелось сделать мой код менее подробным с помощью использования или чего-то большего в строке raw_input() в python.Как назвать GNU ReadLine в Genie

Итак, я узнал о GNU ReadLine в this обсуждениях vala, однако я не могу воспроизвести его в Genie.

код питона, который я хочу, чтобы имитировать это:

loop = 1 
while loop == 1: 
    response = raw_input("Enter something or 'quit' to end => ") 
    if response == 'quit': 
     print 'quitting' 
     loop = 0 
    else: 
     print 'You typed %s' % response 

Дальняя я мог бы получить было:

[indent=4] 

init 
    var loop = 1 
    while loop == 1 
     // print "Enter something or 'quit' to end => " 
     var response = ReadLine.read_line("Enter something or 'quit' to end => ") 
     if response == "quit" 
      print "quitting" 
      loop = 0 
     else 
      print "You typed %s", response 

И пытался компилировать с:

valac --pkg readline -X -lreadline loopwenquiry.gs 

Но я я получаю ошибку:

loopwenquiry.gs:7.24-7.31: error: The name `ReadLine' does not exist in the context of `main' 
     var response = ReadLine.read_line("Enter something or 'quit' to end => ") 
         ^^^^^^^^ 
loopwenquiry.gs:7.22-7.81: error: var declaration not allowed with non-typed initializer 
     var response = ReadLine.read_line("Enter something or 'quit' to end => ") 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
loopwenquiry.gs:8.12-8.19: error: The name `response' does not exist in the context of `main' 
     if response == "quit" 
      ^^^^^^^^ 
loopwenquiry.gs:12.35-12.42: error: The name `response' does not exist in the context of `main' 
      print "You typed %s", response 
            ^^^^^^^^ 
Compilation failed: 4 error(s), 0 warning(s) 

Что я делаю неправильно?

Спасибо.

+0

Это 'Readline' не' ReadLine' (обратите внимание на разницу в случае). –

+0

BTW: Почему бы вам просто не написать свою собственную функцию 'raw_input'? –

ответ

1

Как указано в комментарии от Jens, пространство имен является Readline, а не ReadLine. Функция также является readline, а не read_line. Таким образом, ваш рабочий код будет:

[indent=4] 
init 
    while true  
     response:string = Readline.readline("Enter something or 'quit' to end => ") 
     if response == "quit" 
      print "quitting" 
      break 
     else 
      print "You typed %s", response

Я заметил, что вы используете valac --pkg readline -X -lreadline loopwenquiry.gs компилировать, это хорошо. -X -lreadline сообщает linker об использовании библиотеки readline. В большинстве случаев вам не нужно это делать, потому что есть файл pkg-config, у них есть расширение файла .pc, содержащее всю необходимую информацию. Похоже, что у кого-то есть submitted a patch, чтобы исправить это в библиотеке readline. Таким образом, использование -X -llibrary_i_am_using должно быть исключением, так как большинство библиотек имеют файл .pc.

Я также использовал while..break для бесконечного цикла, чтобы узнать, считаете ли вы, что это немного более чистый стиль.

+0

Я ценю ваши ответы за ответы, спасибо за время. Это усовершенствование кода. AIThomas, каков наилучший способ узнать, когда добавлять команду использования (аналогично импорту) в начале кода и как выяснить, нужен ли мне код -pkg для компиляции правильно? Почему в этом примере мне не нужно было добавлять что-то вроде: использует GNUReadline? –

+1

'uses' не является импортом, поскольку он просто использует пространство имен. Вы можете переписать вышеуказанный код с помощью «Использовать Readline», а затем изменить «Readline.readline» на простое «readline», потому что теперь вы включили все в пространство имен Readline. Сохраняет немного ввода. Если вы не используете «uses», вам просто нужно прикрепить все пространство имен привязки. --pkg - это «импорт», и вам нужно будет использовать его во всех случаях. Genie настроен для использования --pkg glib-2.0 и -pkg gobject-2.0 автоматически. Используйте --verbose с valac, чтобы увидеть это в действии. – AlThomas

+1

Я также написал это в документах - см. Https://wiki.gnome.org/Projects/Genie#Using_a_C_Library – AlThomas