目前这对我来说实际上只是一个概念性问题。
在 Lisp 中,程序就是数据,数据就是程序。 REPL 正是这样做的——读取然后评估。
那么如何以一种安全的方式获取用户的输入呢?显然这是可能的 - 我的意思是 viaweb - 现在 Yahoo!Stores 非常安全,那么它是如何做到的呢?
REPL 代表读取评估打印循环。
(loop (print (eval (read))))
以上只是概念性的,真正的 REPL 代码要复杂得多(包括错误处理、调试……)。
你可以在 Lisp 中读取各种数据,而无需对其进行评估。评估是一个单独的步骤 - 独立于读取数据。
Lisp中有各种各样的IO函数。所提供的函数中最复杂的通常是 READ,它读取 s 表达式。 Common Lisp 中有一个选项允许在 READ 期间进行评估,但在读取数据时可以而且应该将其关闭。
因此,Lisp 中的数据不一定是程序,即使数据是程序,Lisp 也可以将程序读取为数据 - 无需评估。 REPL 只能由开发人员使用,不应暴露给任意用户。为了从用户处获取数据,可以使用普通的 IO 函数,包括 READ 等函数,它可以读取 S 表达式,但不对其求值。
以下是一些不应该做的事情:
使用 READ 读取任意数据。例如,READ 允许读取非常大的数据 - 没有限制。
在 READ 期间进行评估('read eval')。应该关闭此功能。
从 I/O 读取符号并调用其符号函数
当您的函数需要普通列表时,使用 READ 读取循环数据结构。沿着循环列表走下去可能会让你的程序忙碌一段时间。
读取数据期间不处理语法错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)