ncurses egg 中的 `getstr` (Chicken Scheme)
`getstr` in ncurses egg (Chicken Scheme)
我想知道如何使用 this egg 的函数 getstr
(以及 mvgetstr
、mvwgetstr
等的函数)。
例如:
(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))
我想知道如何使用 this egg 的函数 getstr
(以及 mvgetstr
、mvwgetstr
等的函数)。
例如:
(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))