python - python->scheme转换的问题

标签 python arrays scheme

我目前正在尝试使用 scheme 语义编写 Python 程序,这样我以后就可以将它转换为 Scheme,而无需依赖大量 Pythonic 的东西。

我正在尝试使用 a*、深度优先和广度优先搜索算法来解决滑动拼图问题(其中有 9 个插槽和 8 个方 block 排列在一个正方形中)。大约 11 年前,我在 Lisp 的一些 AI 类(class)中这样做过,但基本上当时我对 Lisp 一无所知,我全心全意地讨厌它,只有回想起来我才意识到我在用 Lisp 编写“C”程序。教授在这件事上没有帮助。

我有一个 python 函数可以轻松交换两个图 block :

def swap(p, (r1, c1), (r2, c2)):  
    # Swaps *any* two locations and returns new configuration  
    # Does not concern itself with zero location, etc  
    # Not sure how to do this functionally  
    p_p = p[:]  
    temp = p_p[r1][c1]  
    p_p[r1][c1] = p_p[r2][c2]  
    p_p[r2][c2] = temp  
    return p_p  

我想把它变成你可能在 SICP 中找到的东西,避免副作用等。

但这提出了一个问题。我在 SICP 中读到的所有内容都是递归循环。在恒定时间内访问数组/向量/列表时,我没有看到任何内容。我可以想象一种循环/递归的方式来读取一个元素,但我发现很难想象一种方法来创建一个改变了某个元素的新列表,而不调用产生像 set! 这样的副作用,并且不求助于 crazy if/then/else 子句涉及应更改哪个元素。在考虑二维数组时,这当然会变得更加困惑。在这种情况下,使用 Python 的解决方案是显而易见的,因为它本身就支持多维数组。

在 C/C++/Python/Matlab/Lua/任何其他语言中,通过 [i] 语法访问列表/数组很容易,并且直接转换为下面某处的面向硬件的指针查找。我不明白 scheme 是如何做到这一点的,因为在 scheme 的 SICP 版本中定义了原子操作,它们看起来都非常面向循环和搜索。向量和列表数组访问函数如何工作以获得恒定时间访问? (我在这里完全是新手,所以我不确定我会谈论什么功能)。是否有某个地方正在 secret 访问 C 或汇编库? scheme 中是否存在可用于列表/数组/向量访问的任何固有的恒定时间语义,并且这将允许我暂时在 Python 中以无罪的方式使用该习语?

如何使用 Schemish 语义在 python 中重写上述函数?如何在 Scheme 中重写上述函数?

最佳答案

您确定您最初的问题是尝试用 Lisp 编写 C 语义。尝试用python写scheme语义不是重蹈覆辙吗?我总是尝试将 X 语言作为一种范式和一种语言来学习,并以最 X 风格的方式进行写作。

如果这是您知道将要迁移的业务应用程序,这可能是合理的,但否则我会一开始就将其写成方案。

关于python - python->scheme转换的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/347010/

相关文章:

python socketserver偶尔会停止发送(和接收?)消息

c - 在c中存储unsigned char数组的数组

C++在编译时在两个变量之间交替

javascript - 世界上有没有针对简单函数式语言自身的强大优化编译器?

javascript - Javascript 中的 SICP 练习 1.1.7 被卡住

python - 在 PyQt5 中嵌入终端

python - 从 pandas.HDFStore 表中选择列

python - 尝试将数据插入 SQL 数据库。错误 1046 未选择数据库

java将txt文件(2D)读取到多个2D数组中

lisp - SICP中的一个例子