Поиск…


Синтаксис

  • (define (name arguments ...) body)

  • (аргументы функции ...)

Простые вызовы функций

Вы можете вызвать функцию в Racket, завернув ее в круглые скобки аргументами после нее. Это выглядит как (function argument ...) .

> (define (f x) x)
> (f 1)
1
> (f "salmon")
"salmon"
> (define (g x y) (string-append x y))
> (g "large" "salmon")
"largesalmon"
> (g "large " "salmon")
"large salmon"

Операции типа + и * являются функциями, и они используют тот же синтаксис, что и вызов f или g .

> (+ 1 2)
3
> (* 3 4)
12
> (+ (* 3 3) (* 4 4))
25

Дополнительные сведения и примеры см. В разделе « Вызовы функций» в Руководстве по ракетке.

Аргументы ключевого слова

Функции Racket также могут содержать аргументы ключевых слов , которые задаются ключевым словом, за которым следует выражение аргумента. Ключевое слово начинается с символов #: поэтому аргумент ключевого слова выглядит как #:keyword arg-expr . Внутри вызова функции это выглядит как (function #:keyword arg-expr) .

> (define (hello #:name n)
    (string-append "Hello " n))
> (hello #:name "John")
"Hello John"
> (hello #:name "Sarah")
"Hello Sarah"
> (define (kinetic-energy #:mass m #:velocity v)
    (* 1/2 m (sqr v)))
> (kinetic-energy #:mass 2 #:velocity 1)
1
> (kinetic-energy #:mass 6 #:velocity 2)
12

Дополнительные сведения и примеры см. В разделе « Аргументы ключевых слов» в Руководстве по ракетке.

Функция "apply"

Если у вас есть список и вы хотите использовать элементы этого списка в качестве аргументов функции, то то, что вы хотите, apply :

> (apply string-append (list "hello" " " "and hi" " " "are both words"))
"hello and hi are both words"
> (apply + (list 1 2 3 4))
10
> (apply append (list (list "a" "b" "c") (list 1 2 3) (list "do" "re" "mi")))
(list "a" "b" "c" 1 2 3 "do" "re" "me")

apply принимает два аргумента. Первый аргумент - это функция для применения, а второй аргумент - список, содержащий аргументы.

apply как

(apply + (list 1 2 3 4))

Эквивалентно

(+ 1 2 3 4)

Основное преимущество apply заключается в том, что он работает с произвольными вычисленными списками, включая прилагаемые списки и списки, которые поступают из аргументов функции.

> (apply + (append (list 1 2 3 4) (list 2 3 4)))
19
> (define (sum lst)
    (apply + lst))
> (sum (list 1 2 3 4))
10
> (sum (append (list 1 2 3 4) (list 2 3 4)))
19

Для получения дополнительной информации и примеров см применить функцию в Руководстве Ракетки.

Определения функций

Функции в Racket могут быть созданы с помощью lambda формы. Форма принимает список аргументов и тело.

(lambda (x y) (* x y))

В приведенном выше примере функция принимает два аргумента и возвращает результат их умножения.

> ((lambda (x y) (* x y)) 4 4)
16
> ((lambda (x y) (* x y)) 3 2)
6

Достаточно перезаписать функцию и ее тело каждый раз, когда мы хотим умножить два числа, поэтому давайте назовем это имя. Чтобы присвоить ему имя, используйте форму define . Это свяжет функции с именем.

(define multiply (lambda (x y) (* x y)))

Теперь мы можем обратиться к нашей функции, вызвав multiply

> (multiply 5 2)
10

Поскольку очень часто связывать процедуры с именами, Racket предоставляет сокращенное обозначение функций с использованием формы define.

(define (multiply x y) (* x y))

Дополнительные сведения и примеры см. В разделе Функции: лямбда в руководстве по ракетке.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow