Ракетка использует префиксную нотацию. Это делает запятые ненужными. Сначала некоторый синтаксис:
Как определить функцию?
(
define
(
name
variable1
variable2
)
body
)
Где name
- имя функции, а variable
s - параметры. За которыми следует выражение body
.
Пример:
; Number -> Number
; converts from fahrenheit to celsius.
(define (f2c f)
(* 5/9 (- f 32)))
Как вызвать функцию?
(
name
expression1
expression2
)
name
- название функции иexpression1
и expression2
являются его аргументами.
Пример:
(sqr 3)
;; == 9
Аналогично, чтобы проверить, равны ли два значения: (equal? x y)
Как использовать выражения if?
(
if
question-expression
then-answer-expression
else-answer-expression
)
Если значение выражения вопроса не является ложным, if
оценивает then-answer-expression
, в противном случаеоценивает else-answer-expression
.
Пример:
;; Number -> Number
;; reciprocate all non-zero x, otherwise return 0.
(define (inverse-of-x x)
(if (= x 0) 0 (/ 1 x)))
... и так далее. Прочитайте Руководство по ракеткам , чтобы узнать основные сведения о синтаксисе, семантике и типах данных в языке.
Исправление всего синтаксиса по-прежнему приводит к одной ошибке: бесконечному циклу. Это потому, что рекурсивный вызов не вызывает cdr
в списке. Таким образом, рекурсивный вызов выполняется в одном и том же списке (а не в более коротком списке) навсегда. Обтекание cdr
и исправление синтаксиса приводит к правильной функции.
#lang racket
; [X] [List-of X] -> "true" U "false"
; is x an element of l?
(define (mymember x l)
(if (equal? l null)
"false"
(if (equal? x (car l))
"true"
(mymember x (cdr l)))))
(mymember 2 '()) ; = false
(mymember 2 '(1 3 4 5 6)) ; = false
(mymember 2 '(1 3 2 5 6)) ; = true