Есть ли способ заставить vecfn вызывать vecadd, получая # - PullRequest
0 голосов
/ 14 февраля 2019

Итак, я хочу запустить определение из моего vecfn, которое вызывает vecadd, но когда оно вызывает, оно идет с #procedure:vecadd.Также планирую сделать это с помощью других процедур, таких как - и /.

. Я попытался посмотреть, что такое #procedure, но это только дало мне арифметические примеры.Это не решает вопрос о том, почему #procedure появляется.

(define (vecfn x list1 list2)
    (if (eqv? x +)
         vecadd
    (if (eqv? x -)
         vecsub      
    (if (eqv? x /)
         vecdiv       
          '()))))

(define (vecadd list1 list2)
  (cond ((and (pair? list1) (pair? list2))
         (cons (+ (car list1) (car list2))
               (vecadd  (cdr list1) (cdr list2))))
        ((pair? list1) list1)
        (else list2)))

Использование (vecfn + '(1 2 3) '(1 2 3)) даст мне (2 4 6), но вместо этого даст мне #procedure:vecadd

1 Ответ

0 голосов
/ 14 февраля 2019

Вы на самом деле не вызываете процедуры vecadd, vecsub и vecdiv, vecfn возвращает сами процедуры.Попробуйте это:

(define (vecfn x list1 list2)
  (if (eqv? x +)
      ; invoke procedure with two parameters
      (vecadd list1 list2)
      (if (eqv? x -)
          (vecsub list1 list2)
          (if (eqv? x /)
              (vecdiv list1 list2)
              '()))))

В схеме вы вызываете процедуру, заключая ее в () и передавая параметры, разделенные пробелами: (vecadd list1 list2).

...