使用球拍编辑文件中的文本

时间:2014-07-05 19:13:11

标签: text racket editing

我有一个球拍程序(包含文件)的其他几个文件,其中一些包含我想用主程序中的功能更新的球拍代码。即这就是我想要编辑的文件(基本上)

(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我按照我尝试使用它的方式工作...... :)

我现在无法浏览球拍的文档,但我对编程很陌生,所以其中很大一部分还没有任何意义。是否有某种方法可以使特定功能发挥作用?如果是这样,是否值得,或者是否有更好的方法来实现相同的结果?

非常感谢

1 个答案:

答案 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))))))

这就是发生的事情:

  1. 首先,我们read"somefile.rkt"的内容放入名为input的变量中,结果是一个S-Expressions列表
  2. 然后,正如Chris所建议的,我们使用标准操作操纵该列表,直到它具有所需的值
  3. 最后,我们write将结果返回到同一个文件中,覆盖以前的内容
  4. 最后,"somefile.rkt"将包含以下文字:

    (define somethings
      (quote
       ((some list)
        (some other list)
        (yet another list)
        (do other things))))
    

    不要担心quote,这与撰写'相同。唯一需要注意的是,文本的原始格式将丢失,所有内容都显示在一行中。