gpt4 book ai didi

module - Racket /计划中的运算符重载

转载 作者:行者123 更新时间:2023-12-02 07:30:56 25 4
gpt4 key购买 nike

我在这里遇到了一些麻烦,希望你们能提供帮助。

基本上,我想做的是在 racket 中重载 + 号,这样它将添加两个向量而不是两个数字。另外,我想保留旧的 + 运算符,以便我们仍然可以使用它。我知道这应该在方案中起作用,所以我被告知我需要使用模块*在 Racket 中进行。我仍然不完全确定这一切是如何运作的。

这是我目前所拥有的:

#lang racket

(module* fun scheme/base
(define old+ +)
(define + new+)

(define (new+ x y)
(cond ((and (vector? x) (vector? y))
(quatplus x y))
(else (old+ x y))))

(define (quatplus x y)
(let ((z (make-vector 4)))
(vector-set! z 0 (old+ (vector-ref x 0) (vector-ref y 0)))
(vector-set! z 1 (old+ (vector-ref x 1) (vector-ref y 1)))
(vector-set! z 2 (old+ (vector-ref x 2) (vector-ref y 2)))
(vector-set! z 3 (old+ (vector-ref x 3) (vector-ref y 3)))
z)))

但它似乎根本没有做任何事情。如果有人对此有所了解,我将不胜感激。

谢谢。

最佳答案

我会怎么做是使用 except-inrename-in 规范 require:

#lang racket/base

(require (except-in racket + -)
(rename-in racket [+ old+] [- old-]))

(define (+ x y)
(cond [(and (vector? x) (vector? y))
(quatplus x y)]
[else (old+ x y)]))

(define (quatplus x y)
(vector (+ (vector-ref x 0) (vector-ref y 0))
(+ (vector-ref x 1) (vector-ref y 1))
(+ (vector-ref x 2) (vector-ref y 2))
(+ (vector-ref x 3) (vector-ref y 3))))

(+ (vector 1 2 3 4) (vector 1 2 3 4))
;; => #(2 4 6 8)

您还可以将prefix-inonly-in 一起使用,如果您有许多这样的函数需要重命名,这会更方便:

(require (except-in racket + -)
(prefix-in old (only-in racket + -)))

几点:

  • 我让 quatplus 简单地返回一个新的不可变向量(而不是使用 make-vectorset!)。它更简单,而且可能更快。

  • Racket 的 + 接受任意数量的参数。也许你的应该?

  • 如所写,您的新 + 将因非 vectorvector 的组合而失败。你可能想解决这个问题:

    (+ 1 (vector 1 2 3 4))
    ; +: contract violation
    ; expected: number?
    ; given: '#(1 2 3 4)
    ; argument position: 1st
    ; other arguments...:
    ; 1

关于module - Racket /计划中的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21768408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com