Guile: Изменить указанную c часть функции без экспортированного синтаксиса из модуля? - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь прочитать файл в список строк, чтобы каждая строка в файле была элементом в списке. Можно элегантно прочитать весь файл в строку, используя (use-modules (ice-9 textual-ports)), выполнив что-то вроде:

(use-modules (ice-9 textual-ports))

(call-with-input-file "test.txt" get-string-all)

Существует определенная функция с именем get-line, определенная так:

(define (get-line port)
  (with-textual-input-conditions port (read-line port 'trim)))

Я хотел бы определить функцию, например:

(define (get-line-all port)
  (with-textual-input-conditions port (read-line port 'split)))

Единственная проблема в том, что ports.scm не экспортирует определяющий синтаксис для:

(define-syntax with-textual-input-conditions
  (syntax-rules ()
    ((_ port body0 body ...)
     (with-i/o-port-error port make-i/o-read-error
       (lambda () (with-i/o-decoding-error body0 body ...))))))

Я надеялся, что найдется библиотека или инструмент, который я мог бы использовать аналогичным образом, чтобы использовать el-patch в emacs, который позволит вам изменять функции перед выполнением. Нечто подобное можно сделать в elisp, например:

(el-patch-defun get-string (port)
  (with-textual-input-conditions port (read-line port (el-patch-replace 'trim 'split)))

Возможно ли что-то подобное в Guile? Или мне нужно определить синтаксис with-textual-input-conditions локально?

...