我在没有经验的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))))
骰子掷骰是我想要使用的参数列表。
有什么建议吗?代码段将是伟大的! 感谢。
答案 0 :(得分:4)
回答如何在Racket中传递参数的问题 - 只需在函数名后面声明它们,并注意括号(代码中有几个错误的括号)。我相信你的目标是这样:
(define (throw-value dice-rolls)
(list (list-sum dice-rolls) (car dice-rolls) (car dice-rolls)))
以上内容将返回(sum num1 num2)
格式的列表,请注意num1
和num2
将是相同的数字,因为在这两种情况下,您都会使用第一个元素列表。现在,对于剩下的问题 - 在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))