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
的解决方法,类似的,我正在编辑我的答案。