2014-03-29 6 views
1

Я работаю в Racket без опыта.Передача параметров в Racket

Я буду писать то, что я хотел написать в C:

void function(int array[]){ 
    printf("%i total has been rolled from rolls %i and %i.\n", array[0], array[1], array[2]); 
} 

Как вы можете видеть это только основные функции, которая напечатает значений списка, я хочу передать на мой функция. Я не знаю, как передать параметры (это правильная терминология?) В Racket. Я пытаюсь передать список с форматом: (sum num1 num2), или я могу передать его как ((сумма) num1 num2), если это облегчит процесс.

Это моя текущая функция:

(define (throw-value) 
    (list (list(list-sum (dice-rolls))) (car(dice-rolls)) (car(dice-rolls)))) 

Где кости рулеты мой список параметров, которые я хочу использовать.

Любые предложения? Сегменты кода будут GREAT! Спасибо.

ответ

4

Ответ на вопрос о том, как передать параметры в Racket - просто объявите их после имени функции и будьте осторожны с круглыми скобками (в вашем коде есть несколько ошибочных скобок). Я считаю, что вы стремитесь к чему-то вроде этого:

(define (throw-value dice-rolls) 
    (list (list-sum dice-rolls) (car dice-rolls) (car dice-rolls))) 

выше будет возвращать список в формате (sum num1 num2), имейте в виду, что num1 и num2 будет один и тот же номер, потому что в обоих случаях вы принимаете первый элемент списка. Теперь, для остальной части вопроса - в рэкете, прямой перевод коды C в вопросе будет выглядеть следующим образом:

(define (function vec) 
    (printf "~a total has been rolled from rolls ~a and ~a.~n" 
      (vector-ref vec 0) 
      (vector-ref vec 1) 
      (vector-ref vec 2))) 

(define vec (vector 1 2 3)) ; `vec` is a vector 
(function vec) 
=> 1 total has been rolled from rolls 2 and 3. 

Хотя связанный список является стандартной структурой данных в Lisp языков программирования, всякий раз, когда вам нужен эффективный доступ к данным с учетом индекса, лучше использовать vector, как показано выше. Если по какой-то причине вы действительно должны использовать список, вы можете сделать это, хотя и менее эффективно (связанные списки не оптимизированы для индекса на основе доступа):

(define (function lst) 
    (printf "~a total has been rolled from rolls ~a and ~a.~n" 
      (list-ref lst 0) 
      (list-ref lst 1) 
      (list-ref lst 2))) 

(define lst (list 1 2 3)) ; `lst` is a singly-linked list 
(function lst) 
=> 1 total has been rolled from rolls 2 and 3. 
+1

Спасибо, Оскар, это огромный! – dsiebert424

+2

Как всегда, это было мое удовольствие;) –

1

Поскольку вы используете # ракетку и не Scheme, почему бы не использовать struct

(struct dice (total min max) #:transparent) 

(define (print-dice d) 
    (printf "~a total has been rolled from rolls ~a and ~a.~n" 
      (dice-total d) 
      (dice-min d) 
      (dice-max d))) 

(print-dice (dice 10 2 6)) 
Смежные вопросы