我正在把SRFI 105“卷补”移植到球拍上。
我编写了一个实用的“读取器”,SRFI 105附带了一个REPL,这个REPL功能已经很少改变了(据ia记忆,只修改了一行代码),但我面临着一个困难,在构建语言的球拍生态系统方面并不容易:
-first如何使我的实现解析,不仅是主程序,而且可能包括文件?也就是说,如果我有一个(包括"infix-file.scm"),我希望读取器/解析器在展开步骤之前加载和解析它,这是太晚了,也是比较困难的。
在这里,我的专门代码的开头(其余作为官方SRFI 105)文件SRFI-105.rkt:
#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
; ------------------------------下面是使用它的源文件示例:
#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)明显的结果是:
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已经在球拍中工作,有一些小的变化:
; --------------
; 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)达米恩
发布于 2021-12-28 21:56:43
一个可能的解决方案是使用'require‘而不是'include’从另一个源文件中加载一个源文件,并在每个加载文件的开头再添加一个#lang阅读器"SRFI-105.rkt“。
主文件加载另一个.rkt文件的示例
#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)下面是加载的文件:
#lang reader "SRFI-105.rkt"
{7 * 3}执行将输出以下内容:
Welcome to DrRacket, version 8.2 [cs].
Language: reader "SRFI-105.rkt", with debugging; memory limit: 128 MB.
21
2
7
13
8921来自“必需”文件,请注意,与其包含,您不能控制文件将在哪个行号上加载要求(它们在开头加载)。
https://stackoverflow.com/questions/70499088
复制相似问题