运行 Python LISP 函数

Running Python functions in CLISP

是否有可用的 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)

感谢任何建议...

干杯。

所以我不太明白你想要达到什么目的,但让我们先尝试 运行 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)

In Python 2 这只打印零,因为你没有使用 rational numbers,而只是做一个整数除法 t运行cates 为零(然后乘以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 family" 语言。

如果 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作为循环的起点,结果序列是完全一样的。