2015-06-06 127 views
1

目前,我有以下代码:输出变量值到新的文件

(define (write host code) 
    (with-output-to-file host 
    (lambda() 
     (printf code)))) 

(let ([myself (find-system-path 'run-file)] 
     [test (substring myself 1 3)]) 
    (printf "~s\n" myself) 
    (write "hello.txt" myself)) 

我试图写变量的“自己”的价值。对不起,这样的小白,我不是功能语言的狂热粉丝。

错误:

printf: contract violation 
    expected: string? 
    given: #<path:C:\Program Files\Racket\DrRacket.exe> 

所以我假设我有变量转换自己在为一个字符串?我很困惑在这里,我只知道OOP语言如Perl/Python的

回答

0

的问题是不是printf

> (printf "~s\n" (find-system-path 'run-file)) 
#<path:/Users/soegaard/racketgithub/racket/racket/bin/../DrRacket.app/Contents/MacOS/DrRacket> 

问题是substringsubstring函数需要一个字符串作为输入,并在出现路径时给出错误。

你可以让printf限制这样的输出长度:

> (parameterize ([error-print-width 20]) 
    (printf "~.s\n" (find-system-path 'run-file))) 
#<path:/Users/soe... 

注意在~.s点。

但是,您也可以将路径转换为字符串,然后使用substring

> (substring (~a (find-system-path 'run-file)) 0 20) 
"/Users/soegaard/rack"