2014-03-29 65 views
1

我在沒有經驗的球拍中工作。在球拍中傳遞參數

我會寫什麼,我想用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)))) 

當骰子滾動的是,我希望用我的參數列表。

有什麼建議嗎?代碼段會很棒! 謝謝。

回答

4

回答如何在Racket中傳遞參數的問題 - 只需在函數名後面聲明它們,並小心括號(在代碼中有幾個錯誤的括號)。我相信你瞄準的是這樣的:

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

以上將在格式(sum num1 num2)返回一個列表,注意num1num2將是相同的號碼,因爲在這兩種情況下,你正在做第一列表中的元素。現在,問題的其餘部分 - 球拍,在問題的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

由於您使用#球拍,而不是計劃,爲什麼不使用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))