首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用lisp和infix包

通用lisp和infix包
EN

Stack Overflow用户
提问于 2018-05-06 18:30:19
回答 1查看 269关注 0票数 0

对于常见的lisp,有一个infix包(请参阅http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/code/syntax/infix/infix.cl),它将infix表单转换为前缀。

例如:

代码语言:javascript
复制
(string->prefix "1+2") ;; => (+ 1 2)

它还提供了读取器宏#I,它可以计算infix表单,例如,

代码语言:javascript
复制
#I(1+2) ;; => 3

但我不想用这个阅读器宏。

我编写了一个简单的函数,它使用cl-ppcre将字符串替换为数字,即,

代码语言:javascript
复制
(prepare-form "1+x*x" "x" 3) ;; => "1+3*3"

最后,我有一个计算infix表单的函数。

代码语言:javascript
复制
(defun eval-infix (form &rest args)
  (eval (string->prefix (apply #'prepare-form form args))))

可以在不使用eval函数的情况下实现eval函数吗?我的最后一个目标是像这样调用:

代码语言:javascript
复制
(eval-infix "1+x*x" "x" (+ 1 2))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-08 21:56:46

我想你想用的是string->prefix。这将实习生符号,因此,为了避免污染您自己的包,让我们定义一个。最后,您可以通过定义您自己的eval来避免eval的安全问题。还有一个问题,其他软件包的符号可以写出来,这让我很难过。还有一个问题是,infix读取器可以逃到Lisp读取器,后者可以进行任意的评估。下面是解决方案各部分的草图。我可能把某些函数的论点放在了错误的顺序上。

代码语言:javascript
复制
(defpackage infix-vars)
(defun read-infix-string (s) (let ((*package* (find-package "INFIX-VARS"))) (string->prefix s)))
(defun substitute-var (expr v val)
   (let ((v (etypecase v (symbol v) (string (intern v (find-package "INFIX-VARS"))))))
    (subst expr v val)))
(defun eval-expr (e)
  (etypecase e
    (number e)
    (list
      (ecase (car e)
        (+ (apply #'+ (mapcar #'eval-expr (cdr e))))))))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50203177

复制
相关文章

相似问题

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