2014-05-13 155 views
0

如果我有一個像這樣的列表(define lst '((,(car '(1 2)) (1 2)) (,(car '(3 4)) (3 4)))),我試着'評估'表達式(即作爲結果'((1 (1 2)) (3 (3 4)))),我得到了和我一樣的列表。在球拍列表裏面的表達

我知道如果我使用(quoasiquote ((,(car '(1 2)) (1 2)) (,(car '(3 4)) (3 4)))我獲得了我在找的東西,但是問題出現在迭代方法的執行中,我認爲我不能只取值,沒有一個列表。 (即只取quoasiquote表達式的第二部分)。

例如,如果我使用for/list,我做(list-ref lst 0),我獲得'(,(car '(1 2)) (1 2)),當我想(,(car '(1 2)) (1 2))quoasiquote功能使用它。

如何獲取列表中的表達式並對其進行評估?

謝謝。

+4

問題不明確。請寫出你打算創建的'for/list'循環,指出你期待的結果和你當前獲得的結果 –

+0

@ÓscarLópez我希望現在能更好地解釋! –

回答

0

所以,當你報價數據t就像Perl中一些流行的Algol方言中的單引號。例如print '$_';實際上打印$ _而不是變量$ _所表示的值。如果您使用雙引號,則字符串中的變量將擴展爲其值。

在計劃中我們有(quote x)這是'x。自從'引用它以來,沒有任何內容會被評估。如果它是`x,與(quasiquote x)相同,則Scheme會查找,expression(與(unquote expression)相同)和,@expression(與(unquote-splicing expression)相同)。這些引用格式是而不是程序,但宏。它將您的靜態代碼轉換爲不同的靜態代碼。

所以(begin (define test 10) `((1 2) (3 ,(+ test 4)))) ; ==> ((1 2) (3 14))

什麼計劃確實是將其轉化爲(list '(1 2) (list 3 (+ test 4))),而如果它是`((3 ,(+ test 4)) (1 2))它變成(cons (list 3 (+ test 4)) '((1 2))),因爲尾部可以是恆定的,但頭部可如果它不需要有一個評價的尾巴。

我從你那裏得到一個印象,你認爲你可以存儲文本,然後像(let ((x '((1 2) (3 ,(+ test 4))))) `x)一樣展開它們,但這不起作用,因爲quasiquote是一個宏,因此它將評估爲x。和(let ((x '((1 2) (3 ,(+ test 4))))) `,x)將評估爲((1 2) (3 ,(+ test 4)))

+0

我不得不說,你在這裏寫的所有內容都在Racket手冊中,並且在發佈問題之前閱讀。在此之後,我不得不真誠地說,你的解釋是非常好的。比手冊好。而你是對的:)。我不能,所以我會去適應@uselpa的答案。謝謝你們兩位。 –

0

我很自信,我們在這裏有一個XY-problem因爲你描述的是非常不尋常的。另外,我想在這裏唯一的解決方案是使用eval,這再次表明您可能正在走向錯誤的方向。

但這裏是什麼我相信一點嘗試你想:

(define lst '((list (car '(1 2)) '(1 2)) 
       (list (car '(3 4)) '(3 4)))) 

(define-namespace-anchor nsa) 
(define ns (namespace-anchor->namespace nsa)) 

(for/list ((i lst)) 
    (define e (eval i ns)) 
    (printf "evaluating ~a to ~a\n" i e) 
    e) 

,它將打印

evaluating (list (car '(1 2)) '(1 2)) to (1 (1 2)) 
evaluating (list (car '(3 4)) '(3 4)) to (3 (3 4)) 

和評價

'((1 (1 2)) (3 (3 4))) 
+0

如果我更改''''list',你的答案有效,它是一樣的。但是'','不起作用,所以我要適應我的代碼。謝謝。 –