如何在 Chicken Scheme 中使用类型?

How to use types in Chicken Scheme?

我看到 Chicken scheme 有类型,但是文档中没有示例,我不够聪明,无法从文档中的语法定义中推导出代码。

这是关于类型的文档http://wiki.call-cc.org/man/5/Types#type-syntax

我试过了,我认为应该类型检查(fst定义错误),但它编译和执行得很好

这是代码

(: id (forall (a) (a -> a)))
(define id (lambda (a) a))

(: fst (forall (a b) (a b -> a)))
(define (fst a b) b)

(let ()
  (display (fst 1 "oops")))

我这样构建和执行它

csc -specialize -strict-types foo.scm && ./foo

手册建议 -strict-types 可能不会像您认为的那样:

Note that procedure-definitions in dynamically loaded code that was compiled with -strict-types will not check the types of their arguments which will result in unsafe code. Invoking such procedures with incorrectly typed arguments will result in undefined program behaviour.

根据经验,类型信息的使用有助于优化,而不是强制执行正确性。不正确的类型可能会导致警告或错误,但也可能由于编译器发出无法处理意外数据的专用代码而导致崩溃。

这样就可以使用运行时检查和断言。您可能会发现 simple-contracts egg 对前者有用。