计划中的数据执行

时间:2014-09-15 14:22:05

标签: scheme

在我的矢量和线段下面的实现中,我在实现seg-start和xcor时使用car和cdr的方式似乎很奇怪。这似乎太笼统了,或者这是松散类型语言的工作方式?例如,我不能说只获得一个向量的汽车的xcor。

(define make-vector cons)  // accept 2 numbers and make a vector.
(define make-segment make-vector) // 2 vectors connected to make a segment.

(define seg-start car) 
(define seg-end cdr) 

(define xcor car)
(define ycor cdr)

(define vector1 (make-vector 1 2))
(define vector2 (make-vector 3 4))

(define seg1 (make-segment vector1 vector2))
(xcor (seg-start seg1))
(ycor (seg-start seg1))

3 个答案:

答案 0 :(得分:1)

如果您的Scheme实现支持记录(SRFI 9)或结构,通常最好使用它而不仅仅是cons单元格或向量。 (虽然,记录和结构通常在幕后使用向量,但这是一个实现细节。)

答案 1 :(得分:0)

如果定义了make-vector

  (define make-vector list)

make-segment

  (define make-segment list) ; don't redirect through `make-vector`

然后访问者可以

  (define seg-start first)
  (define seg-end   second)

  (define xcor first)
  (define ycor second)

优点是可以轻松扩展系统并添加 z 坐标或创建多边形或一系列连接的矢量而无需重写代码。缺点单元会略微减少内存使用量,但是如果你在一个价格便宜的千兆字节的时候用完RAM,那么可能是时候重新考虑用C重写部分了。

答案 2 :(得分:0)

使用conscarcdr并不错,但是当他们在坏数据上尝试您的界面时,该界面的用户可能会遇到奇怪的错误。我通常以这种方式开始使用简单的对象,然后继续前进,我需要更多。您可以将其与标签结合使用,以便进行类型检查。例如

(define pair-tag (list 'pair))
(define (kons a d) (cons pair-tag (cons a d)))
(define (kons? x) (and (pair? x) (eq? (car x) pair-tag)))
(define (kar x) (if (kons? x) (cadr x) (error "not a kons")))
(define (kdr x) (if (kons? x) (cddr x) (error "not a kons")))

有一些方法可以使用SRFI-9 Record types创建新类型。您通常会进行类型检查,错误消息会更好,而不必自己动手。

对于完整对象系统和面向对象编程,您可以选择TinyCLOS。 根据你的实现,代码可能需要一些调整,但我确实让它在Racket R6RS上运行一次(我认为它开箱即用于Ikarus)