目前我有以下代码:
(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 :(得分:0)
问题不在于printf
:
> (printf "~s\n" (find-system-path 'run-file))
#<path:/Users/soegaard/racketgithub/racket/racket/bin/../DrRacket.app/Contents/MacOS/DrRacket>
问题是substring
。 substring
函数需要一个字符串作为输入,并在获取路径时给出错误。
您可以让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"