【问题标题】:Running Python functions in CLISP在 CLISP 中运行 Python 函数
【发布时间】:2020-07-31 23:01:42
【问题描述】:

是否有任何可用的 CLISP 资源?我只能找到对 Stack 的引用。

我正在尝试在 CLISP 中运行 python 定义 - 关于如何执行此操作的任何建议?我对在 CLISP 中编写定义非常熟悉,但在 python 中不熟悉……对于初学者,我希望从 python 重写它:

def f(x):
if x <= 1/2:
    return 2 * x
if x > 1/2:
    return 2*x - 1

为了看看 CLISP 如何处理计算分数作为比较,我将运行这个,我从在线计算代数课程中学习:

x = 1/10
for i in range(80):
    print(x)
    x = f(x)

感谢任何建议...

干杯。

【问题讨论】:

  • 请附上您找到的任何链接,以便我们了解您的问题。你指的是什么堆栈?我假设您的意思是 this CLISP? (就像标签一样,所以,可能)来源,你的意思是 its 源代码吗?如果是这样,你为什么要它?还是您的意思是语言规范,例如this?还是您的意思是要学习任何常见的lisp源代码sn-ps?这里的具体问题是如何将您的 Python 代码重写为 Common Lisp 代码?
  • 如何编写 CLISP 格式的 Python 代码?我已经尝试过,但不断出现错误。干杯。
  • 看到你的尝试肯定会有助于回答。请将其包含在您的帖子中。

标签: python common-lisp precision clisp code-translation


【解决方案1】:

所以我真的不明白你想要实现什么,但让我们先尝试运行 Python 示例。目前它的格式很糟糕(可能存在复制粘贴问题),所以这里有适当的缩进:

def f(x):
    if (x <= 1/2):
        return 2 * x
    else:
        return (2 * x) - 1

x = 1/10
for i in range(80):
    print(x)
    x = f(x)

在 Python 2 中,这仅打印零,因为您不使用 rational numbers,而只是执行截断为零的整数除法(然后乘以 2)。在 Python 3 中,结果将是一系列向 1.0 收敛的浮点数,因为浮点数是近似的(感谢 @ex nihilo)。

CLISP 是 Common Lisp 标准的一种特定实现,除其他外(没有特定的顺序 Lispworks、ECL、SBCL、Allegro CL、Clozure Common Lisp、ABCL、CLASP,...)。通常情况下,Common Lisp 缩写为 CL,或者有时只是 Lisp(这是一个颇有争议的观点),因为该家族的其他分支决定遵循完全不同的哲学并以不同的方式命名(Scheme、Clojure 甚至 Julia)。然而,它们都属于“Lisp 家族”语言。

如果您所说的 CLISP 是指 Common Lisp,那么一种惯用的编码方式是:

(defun f (x)
  (if (<= x 1/2)
      (* 2 x)
      (1- (* 2 x))))

(loop
   for i below 80
   for x = 1/10 then (f x)
   collect x)

计算结果为(*)

(1/10 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 
      1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 
      1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5
      1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5
      1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5 3/5 1/5 2/5 4/5)

所以如果你想要 Python 中的等价物,你需要使用分数:

from fractions import Fraction

def f(x):
    if (x <= Fraction(1, 2)):
        return 2 * x
    else:
        return (2 * x) - 1

x = Fraction(1,10)
r = list()
for i in range(80):
    r.append(x)
    x = f(x)

结果列表是:

[Fraction(1, 10), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5), Fraction(3, 5), Fraction(1, 5), Fraction(2, 5), Fraction(4, 5)]

(*) 但是

(loop
   for i below 80
   for x = 0.1 then (f x)
   collect x)

评估为

(0.1 0.2 0.4 0.8 0.6 0.20000005 0.4000001 0.8000002 0.6000004 0.20000076
 0.40000153 0.80000305 0.6000061 0.2000122 0.4000244 0.8000488 0.60009766
 0.20019531 0.40039063 0.80078125 0.6015625 0.203125 0.40625 0.8125 0.625 0.25
 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0)

并将其转换回有理数表明它是

(13421773/134217728 13421773/67108864 13421773/33554432 13421773/16777216
 5033165/8388608 838861/4194304 838861/2097152 838861/1048576 314573/524288
 52429/262144 52429/131072 52429/65536 19661/32768 3277/16384 3277/8192 
 3277/4096 1229/2048 205/1024 205/512 205/256 77/128 13/64 13/32 13/16 5/8 
 1/4 1/2 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 
 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 
 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1)

确实,如果我们使用13421773/134217728作为循环的起点,结果序列是完全一样的。

【讨论】:

  • 太棒了!谢谢 :)。您是如何发展您的 CLISP 技能的?我目前有 Peter Seibel 的书 'Practical Common Lisp'。请问您有什么建议吗?看起来我编写函数的努力很接近,但我的 (
  • 谢谢,有很多书,教程,我觉得cliki对初学者来说有很好的资源:@​​987654323@我主要是看书很多,练习写中小型程序。 CL 不是我学习的第一语言,“你的里程可能会有所不同”。
  • "但只是进行整数除法,截断为零" -- 在 Python 2 中这将是整数除法,但在 Python 3 / 中进行浮点除法和当它的操作数是整数时,产生一个float; OP 代码将在任一下运行。
  • @exnihilo 谢谢,我忘记了两个版本的行为不同,我编辑了答案。
  • 这是一个不错的小东西,呵呵。感谢您的回答。
猜你喜欢
  • 2019-08-23
  • 1970-01-01
  • 2022-11-30
  • 2013-12-21
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多