代码之家  ›  专栏  ›  技术社区  ›  Julian Fondren

从库到BoehmGC的字符串应该如何使用?

ats
  •  0
  • Julian Fondren  · 技术社区  · 6 年前

    在进行一些使用libedit的练习时,为了快速让某些东西工作起来,我想到了以下几点:

    读线.sats:

    #include "share/atspre_staload.hats"
    
    %{#
    #include <editline/readline.h>
    #include <editline/history.h>
    %}
    
    fun readline: string -> Strptr0 = "mac#"
    fun add_history: (!Strptr1) -> void = "mac#"
    fun free_readline: Strptr0 -> void = "mac#free"
    

    fun input_loop(): void =
      let
        val line = readline("input: ")
      in
        if strptr_isnot_null(line) then (
          add_history(line);
          println!("you entered: ", line);
          free_readline(line);
          input_loop()
        ) else free_readline(line)
      end
    

    我对此解决方案有一些问题:

    1. 在确定strprtr为NULL之后,我仍然必须将其传递给free(),因为线性值必须终止。有没有更好的方法来处理这个问题?有没有可能换新的 strptr_isnot_null 有一个函数 终止NULL strptr ?

    2. Strptr1 99%是我想要的。那是一种非常方便的类型。然而, strptr_free() 是的有效终止符 STRPR1型 --但不是为了 这些 值,因为editline库在GC之外执行自己的分配。处理这个问题的好方法是什么?也许,创建一个新类型并重新实现它所需要的一切。也许,创造一个新的类型,但大多使用零成本 castfn ... 打电话的人可能还搞砸了,并尝试使用 免费() .

    1 回复  |  直到 6 年前
        1
  •  0
  •   Hongwei Xi    6 年前

    关于1:

    我不认为有什么简单的方法可以避免对空字符串调用“free”。

    也许您可以尝试定义宏:

    macdef if\线(x,\ then)= 如果strprtr不为空(,(x)),那么,(\u then)else freeline(,(x))

    我将介绍一种抽象类型:

    absvtype readline(l:地址)=ptr

    有趣的readline(prompt:string):[l:addr]readline(l)