球拍是否允许功能重载?

Cla*_*ius 6 racket

我对 Lisp 方案很陌生,对整个函数范式相当陌生,目前正在做一项作业,要求我重载一个具有相同名称但不同参数集的函数racket。下面是我想要实现的目标的示例:

#lang racket

(define (put-ball-in-box two-by-fours nails ball)
  ... )

(define (put-ball-in-box box ball)
  ... )
Run Code Online (Sandbox Code Playgroud)

这些不是实际的功能,但足够接近。正如所暗示的,两个函数都会将一个球放入一个盒子中,但一个函数会首先从其组件组装盒子,然后调用另一个函数。显然,当我在 DrRacket 中或使用命令行尝试上述操作时,出现错误module: duplicate definition for identifier ...

有没有办法实现这一点racket

也许答案就在我面前,但我花了两个小时寻找这个,但找不到任何东西,所以将不胜感激。

谢谢。

小智 6

它并不是通常意义上的“在其他地方编写另一个定义”。

它允许重影,即定义与导入过程同名的过程。因此,您可以(define + ...)并且您的定义+will 隐藏+from racket/base。如果您想要原始过程,那么您可以执行类似以下操作,其中我定义+为添加或字符串附加。

 #lang racket/base
 (require (rename-in racket/base (+ base:+)))

 (define (+ . args)
   (if (andmap string? args)
       (apply string-append args)
       (apply base:+ args)))
Run Code Online (Sandbox Code Playgroud)

您可以做的另一件事是racket/match根据论证的形式采取不同的行为。

#lang racket/base
(require racket/match)
(define (fib . arg)
  (match arg
   [(list n) (fib n 1 0)]
   [(list 1 a b) a]
   [(list 0 a b) b]
   [(list n a b) (fib (sub1 n) (+ a b) a)]))
Run Code Online (Sandbox Code Playgroud)

第二个示例仍然没有完全达到您想要的效果,因为您必须转到原始定义点并修改子句match。但这可能足以满足您的目的。

一个更复杂的示例是使用自定义语法来创建表单define/overload。但我认为你会找到racket/match最好的解决方案。