2014-09-29 84 views
0

我想让我的Scheme程序导入字符串,而不需要在字符串之前使用open-input-string。因此,例如,现在我可以做到以下几点:将字符串导入Scheme而不使用开放输入字符串

> (scheme_lexer (open-input-string "3+4*2")) 

但是,是有我的程序协同工作的方式,如果我输入字符串这样?:

> (scheme_lexer ("3+4*2")) 

谢谢!

+0

如果有任何答案适合您。请接受它。 – Rptx 2014-10-01 15:37:50

回答

1

有什么特别的原因,你不能只是做一个scheme_lexer_string函数处理字符串打交道时,这是否适合你?额外的括号看起来很混乱,而且它们是宏观唯一真正的解决方案。如果丢弃的要求,并做出类似(scheme_lexer "3+4*2")可以接受的,你可以让一个普通的功能,用于处理字符串:

(define (scheme_lexer_string s) 
    (scheme_lexer (open-input-string s))) 

如果你想要的是处理两个输入端口和字符串的函数,你可以做一个一般功能根据特定函数的参数类型进行分派。在这种情况下,原来的scheme_lexer将被重新命名为scheme_lexer_input_port,你将有以下功能:

(define (scheme_lexer_string s) 
    (scheme_lexer_input_port (open-input-string s))) 

(define (scheme_lexer in) 
    (if (string? in) 
     (scheme_lexer_string in) 
     (scheme_lexer_input_port in))) 

现在scheme_lexer作品字符串和端口,并分发到正确的功能所需。

> (scheme_lexer some-input-port) 
... evaluates the content in the port 
> (scheme_lexer "abcd") 
... evaluates the string "abcd" 
+0

这工作。非常感谢! – jean28 2014-10-12 07:49:38

0

这里有一个选项。我已经使用测试功能lexer只是为了显示宏。您可以根据自己的需求进行调整。

(define (lexer sp) (read sp)) 

(define-syntax scheme_lexer 
    (syntax-rules() 
    ((_ (input)) 
    (lexer (open-input-string input))))) 

,并测试:

> (scheme_lexer ("3+4*2")) 
'3+4*2