2012-12-11 49 views
4

如何將輸入轉換爲列表?Scheme將條目轉換爲列表

(define (conjuger v t p) 
    (cond ((equal? t '(present)) (present (radical v) p)) 

我想輸入V作爲一個詞,但我不得不把它輸入作爲程序的工作清單。有沒有辦法有計劃做這個:

'(m a n g e r) => '(manger) 

'(manger) => '(m a n g e r) 
+0

把這樣的符號分開是有點不尋常的。例如,輸入是否以字符串形式出現,是否有特定的原因? – dyoo

回答

3

嘗試此第一部分:

(define (implode lst) 
    (string->symbol 
    (apply string-append 
      (map symbol->string lst)))) 

(list (implode '(m a n g e r))) 
; => '(manger) 

而這第二部分:

(define (explode itm) 
    (map (lambda (c) (string->symbol (string c))) 
     (string->list 
     (symbol->string itm)))) 

(explode (car '(manger))) 
; => '(m a n g e r) 

注意,在你的代碼你正在使用符號,而不是字符串。我相應地寫了我的答案。

0

這是Nils M. Holm,Sketchy Scheme的版本。第4.5版(Raleigh 2011)p。 72-74:

(define (compose f g) 
    (lambda x 
    (f (apply g x)))) 

(define symbol->list 
    (compose string->list symbol->string)) 

(define (explode item) 
    (map (lambda (item) 
     (string->symbol 
      (string item))) 
     (symbol->list item))) 

(define (implode item) 
    (letrec 
     ((sym->char 
     (lambda (item) 
      (let ((string (symbol->string item))) 
      (if (not (= (string-length string) 1)) 
       (error "bad symbol -- IMPLODE") 
       (string-ref string 0)))))) 
    (string->symbol 
    (list->string 
     (map sym->char item))))) 

[email protected](guile-user)> (explode 'foo) 
$1 = (f o o) 
[email protected](guile-user)> (implode '(b a r)) 
$2 = bar 

較舊版本的書是在標題»粗略口齒不清«下PDF或HTML格式免費avaible online(與方案明確處理,雖然)。將符號拆分成列表或反過來的問題在第2.5章中討論。

+0

我不知道那些程序有着名的名字。如果你不介意的話,我借用了我的答案的名字:) –

+0

@Óscar:我不知道這些名字是否是衆所周知的(我在Guile或Racket中找不到它們),但它們相當不錯。別客氣。 :) – 2012-12-12 07:24:48