Как использовать консоль в качестве ввода и вывода для Guile Scheme?

Я понимаю, что Scheme использует порты для ввода и вывода. Пытаясь узнать, как получить консольный ввод и вывод, я наткнулся на переменную console-i/o-port MIT-Scheme.

Но интерпретатор хитрости говорит, что это несвязанная переменная. Я хотел бы знать, как мы можем использовать порты для ввода и вывода на консоль (терминал в Unix) в сценарии Guile Scheme. Я все еще новичок в Scheme и Linux, четкие пошаговые инструкции приветствуются.

Кроме того, как работает (display <object>)? Использует ли он порты по своей сути или есть другой способ.

P.S. Если есть другой способ без использования портов, пожалуйста, дайте мне знать, как его использовать.


person Tarun Maganti    schedule 15.07.2016    source источник


Ответы (2)


Если вы хотите читать и писать SExps, у вас есть (read), (write), (display) и т. д., если вы хотите читать символы, используйте только (read-char) и (write-char) - все они используйте порты ввода/вывода соотв. вы выбрали, по умолчанию это stdin и stdout. Все достаточно просто (https://www.gnu.org/software/guile/manual/html_node/Input-and-Output.html#Input-and-Output).

Вас также могут заинтересовать guile-ncurses (https://www.gnu.org/software/guile-ncurses/).

Из еще нескольких плюшек обратите внимание на модуль pretty-print из ice-9 (на очень длинных секс-файлах он работает медленно, но выводит их в очень красивом формате, что отлично подходит, например, для генерации кода):

  (use-modules (ice-9 pretty-print))
  (pretty-print `(super cool stuff (+ 2 3) => ,(+ 2 3)))

А если вам нужен собственный синтаксический анализатор, обратите внимание на модуль larr (системная база larr).

отредактируйте небольшой пример, который считывает число, умножает само на себя и выводит результат:

#!/usr/bin/guile -s
!#

(let ((x (read)))
  (display (* x x))
  (newline))

(не забудьте chmod +x этот скрипт).

редактировать изменил выражение, чтобы оно приняло форму, как предложил Крис, действительно, чем меньше круглых скобок, тем лучше

person dercz    schedule 15.07.2016
comment
Не могли бы вы дать мне небольшой скрипт для чтения из терминала и его квадратуры и печати. Я хотел знать, есть ли альтернатива для console-i/o-port в MIT-Scheme? - person Tarun Maganti; 15.07.2016
comment
@TarunMaganti, вот так, тебе это поможет? возможно, вам нужен более сложный, но этот отлично работает с stdin/out (я использовал guile ang gambit, часто связанный с другими вещами). - person dercz; 15.07.2016
comment
Кстати, ((lambda (x) (* x x)) (read)) более идиоматически пишется как (let ((x (read))) (* x x)).. - person Chris Jester-Young; 16.07.2016
comment
@ChrisJester-Young, спасибо, теперь выглядит лучше :) - person dercz; 16.07.2016