Вызов функции из условного If - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь вызвать проверку диапазона в условии if внутри функции, называемой add-check.
Вы можете найти проверку диапазона ниже:

;;; range-check takes 4 arguments:  row, numrows, col, numcols It checks if
;;;  0 <= row < numrows and similarly for col and numcols.  If both row and col are in 
;;;  range, range-check returns #t.  If either are out of range, rangecheck  returns #f
(define (range-check row numrows col numcols)
  (not (or (< row 0) (< col 0) (>= row numrows) (>= col numcols))))

Функция - это функция строк и столбцов. Числа и числа - это число. Я пытаюсь вызвать проверку диапазона в соответствии с функцией add-check, приведенной ниже.

  • Если проверка диапазона возвращает true, я хочу вернуть два числа func
  • Если возвращает false,Я хочу напечатать символ точки


Это проверка добавления:

(define (add-check func numrows numcols)
   (if((range-check? (car func) numrows (cdr func) numcols)))
     (cons '((car (func)) (cdr (func))))
     #\.)

Когда я запускаю это, я получаю ошибку:

if: bad syntax in: (if ((range-check? (car func) numrows (cdr func) numcols)))

, что, как я предполагаю, подразумевает ошибку в условии if.

Я уверен, что у меня глупая синтаксическая проблема или множественные синтаксические проблемы. Я новичок в схеме, и это для школьного проекта. Поэтому, пожалуйста, помогите, насколько это возможно.

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Я думаю, что вы хотите:

(define (range-check? row numrows col numcols)
  (not (or (< row 0) (< col 0) (>= row numrows) (>= col numcols))))

(define (add-check func numrows numcols)
  (if (range-check? (car (func)) numrows (cdr (func)) numcols)
      (cons (car (func)) (cdr (func)))
      #\.))
  1. Я думаю, что вы забыли позвонить func в (range-check? (car func)...).
  2. Вы забыли ? в range-check.
  3. У вас есть дополнительный вызов функции вокруг (range-check....), что определенно неверно, поскольку range-check? возвращает логическое значение, которое не вызывается.
  4. if должен иметь тогда, а в других случаях ответвляется внутри скобок,
  5. (cons '((car (func)) (cdr (func)))) неверно. cons использует два аргумента, но вы предоставляете один, который является выражением в кавычках. Я предполагаю, что они должны быть (car (func)) и (cdr (func)).
  6. Если возможно, используйте DrRacket. Вы можете выбрать все и отступ, что позволит легко выявить некоторые из этих ошибок.
  7. Другой способ написать range-check? более кратко: (and (< -1 row numrows) (< -1 col numcols)).
  8. Возможно, вы захотите позвонить func только один раз и свяжите его результат с переменной, и используйте эту переменную вместо этого. В случае, если func дорого, это сделает ваш код более эффективным.
  9. Вы можете упростить (cons (car (func)) (cdr (func))) до (func)!
0 голосов
/ 01 октября 2019

args не понятно, я думаю, что вы хотите, это моя версия:

#lang racket

(define (range-check? row numrows col numcols)
  (not (or (< row 0) (< col 0) (>= row numrows) (>= col numcols))))

(define (some-func row col)
  (format "row:~a col:~a" row col))

(define (add-check rowandcol numrows numcols num-func)
   (if (range-check? (car rowandcol) numrows (cdr rowandcol) numcols)
     (num-func (car rowandcol) (cdr rowandcol))
     #\.))

(add-check '(1 . 2) 10 10 some-func)

(add-check '(1 . 2) 1 1 some-func)

(add-check '(1 . 2) 2 3 (lambda (num col) #t))
...