代码之家  ›  专栏  ›  技术社区  ›  Ralph java.is.for.desktop

Clojure静态类型

  •  23
  • Ralph java.is.for.desktop  · 技术社区  · 14 年前

    我知道这听起来可能是对Lisp爱好者(以及其他动态语言爱好者)的亵渎,但是要增强Clojure编译器以支持静态(编译时)类型检查有多困难呢?

    撇开支持和反对静态和动态类型的参数不谈,这是否可能(而不是“这是否可取”)?

    我在想,添加一个新的reader宏来强制编译时类型(增强版的#^宏)并将类型信息添加到符号表,将允许编译器标记变量被误用的位置。例如,在下面的代码中,我希望出现编译时错误(#*是“编译时”类型的宏):

    (defn get-length [#*String s] (.length s))
    (defn test-get-length [] (get-length 2.0))
    

    宏甚至可以与全局变量一起重用( *compile-time-type-checking* )强制编译器进行检查。

    对可行性有什么想法吗?

    6 回复  |  直到 11 年前
        1
  •  7
  •   Stuart Sierra    14 年前

    当然有可能。编译器已经在1.3开发分支中围绕基元参数类型执行了一些静态类型检查。

        2
  •  10
  •   dnolen    14 年前

    肯定有可能。但是我不认为Clojure会得到任何形式的弱静态类型——它的好处太少了。

    http://www.lambdassociates.org/qilisp.htm

    alt text

        3
  •  7
  •   Ambrose    11 年前

    对!看起来有个项目正在进行中, core.typed ,使可选静态类型检查成为现实。见 Github project 以及 documentation

    这个作品 grew out of an undergraduate honours dissertation (PDF) 安布罗斯·邦奈尔中士,与 Typed Racket 系统。

        4
  •  0
  •   Bryan    14 年前

    由于一次只能读取和计算一个表单,因此您不能有转发引用,这会造成一定的限制。

        5
  •  0
  •   johnbakers    11 年前

    老问题,但有两点很重要:我不认为Clojure支持reader宏,只支持普通的lisp宏。现在我们有了core.typed选项来输入Clojure。

        6
  •  0
  •   hichris123 Andreas Sewe    11 年前

    declare可以有类型提示,因此可以声明一个“is”类型的变量,该类型尚未定义,但包含有关结构的数据,但这将非常笨拙,必须在 能够 在定义类型之前执行。基本上,您需要预先定义所有用户定义的类型,然后像平常一样使用它们。我认为这使得图书馆写作有点老套。

    我之前并不是说这是不可能的,只是对于用户定义的类型,它比预定义的类型复杂得多。做这件事的好处和代价是应该认真考虑的。但我鼓励任何有兴趣的人尝试一下,看看他们是否能成功!