Scheme `鸡蛋(鸡肉计划)中的getstr`
我正在试图弄清楚如何使用的函数Scheme `鸡蛋(鸡肉计划)中的getstr`,scheme,ncurses,chicken-scheme,Scheme,Ncurses,Chicken Scheme,我正在试图弄清楚如何使用的函数getstr(以及因此而产生的mvgetstr,mvwgetstr,等等)。 例如: (require-extension ncurses) (let ((stdscr (initscr)) (str (make-string 10))) (getstr str) (addstr str) (getch)) (define (mvgetstr x y) (move y x) (let loop ((str "")) (let ((ch
getstr
(以及因此而产生的mvgetstr
,mvwgetstr
,等等)。
例如:
(require-extension ncurses)
(let ((stdscr (initscr)) (str (make-string 10)))
(getstr str)
(addstr str)
(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)))))))
csi
告诉我
错误:参数类型错误-不是指针:“”
所以我试着用这个:
(require-extension ncurses)
(let ((stdscr (initscr)) (str (make-string 10)))
(begin
(getstr (object->pointer str))
(addstr str)
(getch))))
这次csi
给我另一个错误:
错误:错误的参数类型-不是字符串:[panic]在堆栈中检测到损坏的数据-执行已终止
我认为问题在于字符串的编码(一个函数认为是ascii和另一个utf-8)。我没有在scheme中使用指针的经验,我只知道用这个鸡蛋来获得字符串的最好的防白痴方法。最后我认为这是ncurses鸡蛋的一个bug。他们说这是一个错误,它是正确的,但我有同样的问题,与上一个版本 然而,这些函数并不是真正的scheme式的,使用
getch
重新定义这些函数很简单(它工作正常)。
例如:
(require-extension ncurses)
(let ((stdscr (initscr)) (str (make-string 10)))
(getstr str)
(addstr str)
(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))
这似乎适用于鸡肉计划的第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))
是的,不幸的是,ncurses蛋的含量很低:(有一个处理诅咒的替代鸡蛋叫做,但它不是很完整,而且很久没有被研究过。你可能会发现它很有趣!我知道它,但它没有提供我想要的,但是我找到了一个使用
mvgetstr
的解决方法,类似的,我正在编辑我的答案。