Racket 重载结构构造函数

Racket 重载结构构造函数,racket,Racket,有没有办法在Racket中重载struct的构造函数,以便使继承的参数成为可选的 在我的例子中,我想为我的应用程序定义一些自定义异常。 例如: (struct exn:my-app exn ()) (struct exn:my-app:illegal-access exn:my-app ()) 然而,要实例化一个非法访问异常,我必须使用从exn消息和延续标记继承的2个参数调用构造函数,这相当麻烦 是否可以为exn:my app及其所有子代定义一个构造函数,使这两个参数都是可选的?所以我可以打电

有没有办法在Racket中重载struct的构造函数,以便使继承的参数成为可选的

在我的例子中,我想为我的应用程序定义一些自定义异常。 例如:

(struct exn:my-app exn ())
(struct exn:my-app:illegal-access exn:my-app ())
然而,要实例化一个非法访问异常,我必须使用从exn消息和延续标记继承的2个参数调用构造函数,这相当麻烦

是否可以为exn:my app及其所有子代定义一个构造函数,使这两个参数都是可选的?所以我可以打电话:

(raise (exn:my-app:illegal-access))
(raise (exn:my-app:illegal-access "Message")) ?

谢谢,

这里有一种方法:

(struct exn:my-app exn ()
        ;; change the name of the constructor
        #:constructor-name make-exn:my-app)

;; custom constructor
(define (exn:my-app [msg "default msg"]
                    [marks (current-continuation-marks)])
  (make-exn:my-app msg marks))

(exn:my-app) ; this works now

由于需要对每种结构类型执行此操作,因此可能需要定义一个对其进行抽象的宏。我打赌有人已经在Racket邮件列表上共享了这样一个宏,但我想不起来有这样一个宏,所以如果我找到一个引用,我会更新这个答案。

这里有一个方法:

(struct exn:my-app exn ()
        ;; change the name of the constructor
        #:constructor-name make-exn:my-app)

;; custom constructor
(define (exn:my-app [msg "default msg"]
                    [marks (current-continuation-marks)])
  (make-exn:my-app msg marks))

(exn:my-app) ; this works now

由于需要对每种结构类型执行此操作,因此可能需要定义一个对其进行抽象的宏。我打赌已经有人在Racket邮件列表上共享了这样一个宏,但我想不起来有这样一个宏,所以如果我找到一个参考,我会更新这个答案。

Scheme没有您所想的那种重载,但它有可选参数,它确实有case lambda,但不确定是否可以将其用于结构。Scheme没有您所想到的那种重载,但它有可选参数,它确实有case lambda,但不确定是否可以将其用于结构。这一点很好!最后,我定义了一个自定义的raise方法,使用了异常和2个自定义参数;工作少了;谢谢正如所指出的,如果我现在运行这个示例,我会收到一条错误消息:。模块:中标识符的重复定义:exn:my appGood point!最后,我定义了一个自定义的raise方法,使用了异常和2个自定义参数;工作少了;谢谢正如所指出的,如果我现在运行这个示例,我会收到一条错误消息:。模块:重复定义:exn:my app中的标识符