2012-11-17 79 views
1

我有一個實驗我的項目,我基本上需要嵌入式一些s表達式插入代碼,並使其運行,這樣,如何將表達式列表添加到代碼中?

(define (test lst) 
    (define num 1) 
    (define l (list)) 
    `@lst) ; oh, this is not the right way to go. 

    (define lst 
    `((define num2 (add1 num)) 
     (displayln num2))) 

我希望test功能像test(lst)在後球拍代碼:

(define (test lst) 
    (define num 1) 
    (define l (list)) 
    (define num2 (add1 num) 
    (displayln num2)) 

我該如何在球拍中做到這一點?

更新 我想用eval或前面這些問題的原因是,我使用Z3球拍結合,我需要生成公式(使用球拍綁定API),然後我就火在查詢有一點,那時候我需要評估這些代碼。 我還沒有想出其他的方法在我的情況去... 一個超級簡單的例子是,想象
(let ([arr (array-alloc 10)])
(array-set! arr 3 4))

我有一些模型來分析結構(所以我並沒有直接使用racketZ3 ),每個分析點的過程中,我將在映射程序到Z3類型的數據類型,並取得了一定的斷言,

我將生成類似:

  • 在分配站點,我將需要進行下面的公式:

    (smt:declare-fun arr_z3() IntList)
    (define len (make-length 10))

  • 然後,在陣列組網站,我將具有以下斷言和檢查3是否小於則長度

    (smt:assert (</s 3 (len arr_z3)))
    (smt:check-sat)

  • 於是最後,我會收集生成公式如上,並在其中能火Z3結合運行以下收集的信息作爲代碼的形式將它們包裝:

    (smt:with-context
    (smt:new-context)
    (define len (make-length 10))
    (smt:assert (</s 3 (len arr_z3))) (smt:check-sat))

這是超級簡單的例子,我能想到的。 .. 有道理?
附註。由於某些原因,Z3 Racket綁定在5.3.1版本中會崩潰,但它大部分可以在5.2.1版本上工作。

+0

從這加你的其他問題http://stackoverflow.com/questions/13428091/how-to-make-eval-work-on-define關於使用'eval',它聽起來像你想在運行時編寫代碼?你能幫助我們理解你在做什麼嗎? 'eval'可能不是最好的解決方法。 –

+0

@GregHendershott問題中的編輯是否清晰? – monica

+1

我只是在https://github.com/sid0/z3.rkt/blob/master/examples/nqueens.rkt快速瀏覽了Z3軟件包的N-Queens示例,並且我沒有看到任何理由爲什麼你需要這裏的語法級別的東西;爲什麼生成查詢需要eval?你能提供一個你想制定查詢方式的超級簡單例子嗎? –

回答

1

老實說,我不明白你想達到什麼目的。引用N.Holm,Sketchy Scheme,第4.5版,p。 108:»quasiquotation的主要目的是構建只包含幾個可變部分的固定列表結構«。我不認爲這種擬合會在你所瞄準的背景下使用。

對於quasiquotation的典型的環境考慮下面的例子:

(define (square x) 
    (* x x)) 

(define sentence 
    '(The square of)) 

(define (quasiquotes-unquotes-splicing x) 
    `(,@sentence ,x is ,(square x))) 

(quasiquotes-unquotes-splicing 2) 
===> (The square of 2 is 4) 
1

警告:如果你不熟悉的功能方案是如何工作的,忽略了答案!宏是一種先進的技術,你需要首先理解函數。

這聽起來像你問宏。下面是一些代碼,定義test是,打印2功能:

(define-syntax-rule (show-one-more-than num) 
    (begin 
    (define num2 (add1 num)) 
    (displayln num2))) 

(define (test) 
    (define num1 1) 
    (show-one-more-than num1)) 

現在,我可以(也應該!)寫了show-one-more-than的功能,而不是一個宏(如果你改變define-syntax-rule代碼仍然可以工作到define),但宏實際上是通過在其呼叫站點生成代碼來操作的。所以上面的代碼擴展爲:

(define (test) 
    (define num1 1) 
    (begin 
    (define num2 (add1 num1)) 
    (displayln num2))) 
1

不知道這個問題比較好,這是很難說的正確的方法解決這個問題是什麼。一個蠻力的方法,如下:

#lang racket 

(define (make-test-body lst) 

    (define source `(define (test) 
        (define num 1) 
        (define l (list)) 
        ,@lst)) 
    source) 


(define lst 
    `((define num2 (add1 num)) 
    (displayln num2))) 

(define test-source 
    (make-test-body lst)) 

(define test 
    (parameterize ([current-namespace (make-base-namespace)]) 
    (eval `(let() 
      ,test-source 
      test)))) 

(test) 

可能是你想要的,但可能不是。

相關問題