首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SRFI 105作为一种球拍语言,如何解析包含文件?

SRFI 105作为一种球拍语言,如何解析包含文件?
EN

Stack Overflow用户
提问于 2021-12-27 18:22:23
回答 1查看 69关注 0票数 1

我正在把SRFI 105“卷补”移植到球拍上。

我编写了一个实用的“读取器”,SRFI 105附带了一个REPL,这个REPL功能已经很少改变了(据ia记忆,只修改了一行代码),但我面临着一个困难,在构建语言的球拍生态系统方面并不容易:

-first如何使我的实现解析,不仅是主程序,而且可能包括文件?也就是说,如果我有一个(包括"infix-file.scm"),我希望读取器/解析器在展开步骤之前加载和解析它,这是太晚了,也是比较困难的。

在这里,我的专门代码的开头(其余作为官方SRFI 105)文件SRFI-105.rkt:

代码语言:javascript
复制
#lang racket
(require syntax/strip-context)
 
(provide (rename-out [literal-read read]
                     [literal-read-syntax read-syntax]))


(define (literal-read in)
  (syntax->datum
   (literal-read-syntax #f in)))
 
(define (literal-read-syntax src in)
  
  (define lst-code (process-input-code-rec in))

  `(module anything racket ,@lst-code))

;; read all the expression of program
;; a tail recursive version
(define (process-input-code-tail-rec in) ;; in: port
  (define (process-input acc)
    (define result (curly-infix-read in))  ;; read an expression
    (if (eof-object? result)
    (reverse acc)
    (process-input (cons result acc))))
  (process-input '()))


  ; ------------------------------
  ; Curly-infix support procedures
  ; ------------------------------

下面是使用它的源文件示例:

代码语言:javascript
复制
#lang reader "SRFI-105.rkt"
(- (+ 3 3)
   {2 + 2})

{5 + 2}

(define (fibonacci n)
  (if (< n 2)
      n
      (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
(fibonacci 7)

(define (fib n)
  (if {n < 2}
      n
      {(fib {n - 1}) + (fib {n - 2})} ))

(fib 11)

明显的结果是:

代码语言:javascript
复制
Welcome to DrRacket, version 8.2 [cs].
Language: reader "SRFI-105.rkt", with debugging; memory limit: 128 MB.
2
7
13
89
> 

-second,我知道如何使#lang“我的language.rkt”解析以下代码,但我不知道如何在Racket生态系统中集成工作的SRFI 105 REPL (目前它在一个单独的文件中工作,而不是解析器)。

在这里,官方的SRFI 105已经在球拍中工作,有一些小的变化:

代码语言:javascript
复制
  ; --------------
  ; Demo of reader
  ; --------------

(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))

;{1 + 1}
;(+ 1 1)
;2
;(define k {1 + 1})
;(define k (+ 1 1))
;#<void>
;k
;k
;2

  ; repeatedly read in curly-infix and write traditional s-expression.
  (define (process-input)
    (let ((result (curly-infix-read)))
      (cond ((not (eof-object? result))
         (let ((rv (eval result ns)))
           (write result) (display "\n")
           (write rv)
           (display "\n"))
         ;; (force-output) ; flush, so can interactively control something else
         (process-input)) ;; no else clause or other
        )))

(process-input)

达米恩

EN

回答 1

Stack Overflow用户

发布于 2021-12-28 21:56:43

一个可能的解决方案是使用'require‘而不是'include’从另一个源文件中加载一个源文件,并在每个加载文件的开头再添加一个#lang阅读器"SRFI-105.rkt“。

主文件加载另一个.rkt文件的示例

代码语言:javascript
复制
#lang reader "SRFI-105.rkt"
(require "examples-curly-infix2.rkt")
(- (+ 3 3)
   {2 + 2})

{5 + 2}

(define (fibonacci n)
  (if (< n 2)
      n
      (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
(fibonacci 7)

(define (fib n)
  (if {n < 2}
      n
      {(fib {n - 1}) + (fib {n - 2})} ))

(fib 11)

下面是加载的文件:

代码语言:javascript
复制
#lang reader "SRFI-105.rkt"
{7 * 3}

执行将输出以下内容:

代码语言:javascript
复制
Welcome to DrRacket, version 8.2 [cs].
Language: reader "SRFI-105.rkt", with debugging; memory limit:         128 MB.
21
2
7
13
89

21来自“必需”文件,请注意,与其包含,您不能控制文件将在哪个行号上加载要求(它们在开头加载)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70499088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档