2012-07-03 52 views
4

,因爲昨天我一直在試圖編程實現方案的特例聲明,將做到以下幾點:定義的語法使用的方案

(define (sort x) 
    (cond ((and (list? x) x) => (lambda (l) 
           (sort-list l))) 
     ((and (pair? x) x) => (lambda (p) 
         (if (> (car p) (cdr p)) 
          (cons (cdr p) (car p)) 
          p))) 
     (else "here"))) 

,而不是使用所有的和的和電導率的說法,我將有:

(define (sort x) 
    (scase ((list? x) => (lambda (l) 
           (sort-list l))) 
     ((pair? x) => (lambda (p) 
         (if (> (car p) (cdr p)) 
          (cons (cdr p) (car p)) 
          p))) 
     (else "here"))) 

我到目前爲止做的,是這樣的:

(define (sort x) 
    (scase (list? x) (lambda (l) 
         (sort-list l))) 
    (scase (pair? x) (lambda (p) 
         (if (> (car p) (cdr p)) 
          (cons (cdr p) (car p)) 
          p)))) 

與此代碼:

(define-syntax scase 
    (syntax-rules() 
    ((if condition body ...) 
    (if condition 
     (begin 
      body ...))))) 

我想現在要做的,只是讓scase語句有多個參數是這樣的:

(scase ((list? (cons 2 1)) 'here) 
     ((list? '(2 1)) 'working)) 

,但我似乎無法弄清楚我如何能做到這一點。也許你們可以給我一點幫助?

在此先感謝;)

回答

2

如果這是在學習如何使用語法規則,那麼忽略這個答案的練習。

我看到了一種方法來簡化您開始的代碼。

(define (sort x) 
    (cond ((list? x) 
      (sort-list x)) 
     ((pair? x) 
      (if (> (car x) (cdr x)) 
       (cons (cdr x) (car x)) 
       x))) 
     (else "here"))) 

由於所有的(and (list? x) x) => (lambda l ...所做的就是看是否x是一個列表,然後綁定lx,(因爲#f不是一個列表,'()是不假,至少在球拍),你可以跳過所有這些,只需使用x。萬一你不需要使用=>,在這種情況下,它不起作用。 =>是有用的,如果你想做一個測試,返回一些有用的,如果成功,否則#f

現在,如果你想使用宏,那麼你將需要澄清你希望它做得更好一點。我認爲這個案子已經做到了你想要的。您現有的宏只是if,所以我不確定如何擴展它。

2

我發現我的問題的解決,這裏有雲:

(define-syntax cases 
    (syntax-rules() 
    ((_ (e0 e1 e2 ...)) (if e0 (begin e1 e2 ...))) 
    ((_ (e0 e1 e2 ...) c1 c2 ...) 
    (if e0 (begin e1 e2 ...) (cases c1 c2 ...))))) 

謝謝大家反正:)

+0

如果這回答了你的問題,你應該[接受它](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 –

0

這裏有一個解決方案:

#lang racket 

(require mzlib/defmacro) 

(define-syntax scase 
    (syntax-rules (else) 
    ((_ (else body1)) body1) 
    ((_ (condition1 body1) (condition2 body2) ...) 
    (if condition1 
     body1 
     (scase (condition2 body2) ...))))) 

(define (sort1 x) 
    ((scase ((list? x) (lambda (l) 
         (sort l <))) 
     ((pair? x) (lambda (p) 
         (if (> (car p) (cdr p)) 
          (cons (cdr p) (car p)) 
          p))) 
     (else (lambda (e) "here"))) 
    x)) 

它工作在DrRacket。我對您的解決方案做了三處更改。首先,我將sort程序重命名爲sort1,因爲排序內置在方案中(我在sort1中使用了它)。其次,我已經改變了sort1本身,以便給出的輸入將被傳遞給scase返回的程序,您將直接獲得排序結果。第三,我修改了scase語法擴展,以便它將接受else條件。

>(sort1 (list 3 1 2)) 
'(1 2 3) 

> (sort1 (cons 2 1)) 
'(1 . 2) 

> (sort1 'here) 
"here" 

我建議你閱讀Kent Dybvig的「The Scheme Programming Language」。有關於句法擴展的整章。

+0

錯誤,你所做的只是重寫cond(沒有=>「功能」)。如果你在最終答案中用cond替換scase,代碼將起作用。如果這就是你正在做的事情,那就說出來。 –