我有一个球拍程序(包含文件)的其他几个文件,其中一些包含我想用主程序中的功能更新的球拍代码。即这就是我想要编辑的文件(基本上)
(define somethings '(
(some list)
(some other list)
(yet another list)))
我希望能够在列表中添加更多内容,我认为这是更好的方法,但是因为我刚接触到这个是我首先尝试的内容:
(define (update-file arg1 arg2 arg3 . args)
(call-with-output-file "somefile.rkt" #:exists 'append
(lambda (output-port)
(print "\b\b" output-port) ;; have tried several variations of this they all
(do other things) ;; print the backspaces literally rather than
(display "))" output-port) ;; removing characters
(newline output-port))))
我认为这个问题都是A:我使用append,可能只是在最后粘贴东西(但更新和截断看起来不像答案)而B:打印\ b没有&#39我按照我尝试使用它的方式工作...... :)
我现在无法浏览球拍的文档,但我对编程很陌生,所以其中很大一部分还没有任何意义。是否有某种方法可以使特定功能发挥作用?如果是这样,是否值得,或者是否有更好的方法来实现相同的结果?
非常感谢
答案 0 :(得分:2)
尝试一下:
(call-with-input-file "somefile.rkt"
(lambda (in)
(let* ((input (call-with-input-string (port->string in) read))
(output (list (car input) ; define
(cadr input) ; somethings
(list 'quote
(append
(car (cdaddr input)) ; old list
'((do other things))))))) ; new elements
(call-with-output-file "somefile.rkt" #:exists 'replace
(lambda (out)
(write output out))))))
这就是发生的事情:
read
将"somefile.rkt"
的内容放入名为input
的变量中,结果是一个S-Expressions列表write
将结果返回到同一个文件中,覆盖以前的内容最后,"somefile.rkt"
将包含以下文字:
(define somethings
(quote
((some list)
(some other list)
(yet another list)
(do other things))))
不要担心quote
,这与撰写'
相同。唯一需要注意的是,文本的原始格式将丢失,所有内容都显示在一行中。