在Racket中传递参数

时间:2014-03-29 16:21:21

标签: parameters scheme lisp 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)或者我可以将它作为((sum)num1 num2)传递,如果这样可以更容易。

这是我目前的职能:

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

骰子掷骰是我想要使用的参数列表。

有什么建议吗?代码段将是伟大的! 感谢。

2 个答案:

答案 0 :(得分:4)

回答如何在Racket中传递参数的问题 - 只需在函数名后面声明它们,并注意括号(代码中有几个错误的括号)。我相信你的目标是这样:

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

以上内容将返回(sum num1 num2)格式的列表,请注意num1num2将是相同的数字,因为在这两种情况下,您都会使用第一个元素列表。现在,对于剩下的问题 - 在Racket中,问题中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 :(得分:1)

由于您使用#!Racket而非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))