我目前正在尝试使用 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/