Схема определения конструктора и селекторов для матричного объекта

Я пытаюсь разработать конструктор и селекторы для простой матрицы 2x2, но я не уверен, что то, что я сделал, правильно. Это берет список с 4 элементами и делает 2x2:

(define matrix2x2
  (lambda (list)

    (define to-list list) ;returns the list form of this matrix
    (define get-place ;returns a place based on input row col
      (lambda (row col)
        (cond ((and (equal? row 1) (equal? col 1)) (car list))
              ((and (equal? row 1) (equal? col 2)) (car (cdr list)))
              ((and (equal? row 2) (equal? col 1)) (car (cdr (cdr list))))
              ((and (equal? row 2) (equal? col 2)) (car (cdr (cdr (cdr list)))))
              (else (display "no such place")))))

    (lambda (ret)
      (cond ((eq? ret 'get-place) get-place)
            ((eq? ret 'to-list) to-list)
            (else (error "Unknown request" ret))))))

;tests
(define my-matrix (m2x2 '(8 1 2 7)))
((my-matrix 'get-place) 2 2)
(my-matrix 'to-list)

Это работает... но я не уверен, что правильно использую селекторы.

1 ответ

Решение

То, что вы сделали, - это "обычный" способ Scheme для реализации объектов через замыкания. Конечно, вы можете продолжить, чтобы определить некоторые вспомогательные функции для селекторов:

(define (get-place matrix ix) ((matrix 'get-place) ix)
(define (matrix->list matrix) ...)

Я не уверен, что понимаю, что вы спрашиваете о "правильном" использовании селекторов. Ведь вы уже знаете, что это работает...

Другие вопросы по тегам