ncurses egg 中的 `getstr` (Chicken Scheme)

`getstr` in ncurses egg (Chicken Scheme)

我想知道如何使用 this egg 的函数 getstr(以及 mvgetstrmvwgetstr 等的函数)。 例如:

(require-extension ncurses)

(let ((stdscr (initscr)) (str (make-string 10)))
  (getstr str)
  (addstr str)
  (getch))

csi告诉我

Error: bad argument type - not a pointer: " "

所以我尝试了这个:

(require-extension ncurses)

(let ((stdscr (initscr)) (str (make-string 10)))
  (begin      
  (getstr (object->pointer str))
   (addstr str)
   (getch)))) 

这次csi再报错:

Error: bad argument type - not a string: [panic] Detected corrupted data in stack - execution terminated

我认为问题出在字符串的编码上(一个函数认为是 ascii 而另一个是 utf-8)。我对 scheme 中的指针没有经验,我只是想知道用这个鸡蛋获取字符串的最佳防白痴方法。

最后我认为这是ncurses egg的一个bug。 Here 他们说这是一个错误,它是正确的,但我在上一个版本中遇到了同样的问题。

然而,这些函数并不是真正的方案,使用 getch 重新定义这些函数很简单(可以正常工作)。 例如:

(define (mvgetstr x y)
  (move y x)
  (let loop ((str ""))
    (let ((ch (getch)))
      (if (eq? (char->integer ch ) 10) ;10 is the ENTER KEY code
      str
      (loop (string-append str (string ch)))))))

编辑:另一位用户建议了一种使用此功能和类似功能的方法:

(use ncurses lolevel data-structures)

(define (get-string max)
  (let ((buffer (make-string max #\null)))
    (getnstr (make-locative buffer) max)
    (string-translate buffer #\null)))

(let ((stdscr (initscr))
      (str (get-string 10)))
  (addstr str)
  (getch)
  (write str))

这似乎适用于 Chicken Scheme 的第 5 版:

(import ncurses
     (chicken locative)
     (chicken string))

(let ((stdscr (initscr)) (str (make-string 10)))
    (getstr (make-locative str))
    (addstr (string-translate str #\null))
    (getch)
    (endwin))