请教个 Emacs Calc 问题

有下面这样两个行列式:

想得到结果:

[ [a, 8 ]   # 10 - 2
  [b, 10]   # 10
  [c, 5]    # 10 - 5
  [d, 10] ] # 10

不知道这个操作的数学定义是什么。

其实我就是做一个批量的加/减运算,场景就是第一次有 M 个人分别买入了多少份额的理财产品,第二次是M 中的 N 个人赎回了多少份额,现在我想知道赎回之后每个人各剩余多少钱。上面例子中的 a, b, c, d 其实就是投资人的 ID。

这两天研究一下,应该没有现成的 calc 函数,尝试了一下自定义 calc 函数,可是 calc 的 defmath 宏玩了半天没玩转

这个问题如果用纯数学的语言描述的话是什么样的?

……………… 就是 a b c d的初始值都是10,a 和 c 分别减2和5。

@lululau 感觉这种工作用excel之类的统计表格处理更合适,org的表格也能做这种简单的批量运算,底层也是调用calc。

会计工作可以试试CLT的ledger,Spacmacs 的finance layer用的就是这个。

1 个赞

嗯,谢谢,我研究下 finance layer

题外话: ledger 有很多用不同语言实现的版本,包括 Python, Haskell, Perl, C++, Go。甚至它的作者用Common Lisp写了一个原型,不过因为是原型所以没有在维护。

这个应用本身不编辑数据文件,所以需要一个编辑器,比如Emacs,来处理数据。

然后因为 ledger 把 ; # *等都处理成注释符号,所以可以把数据嵌入在 org 里面使用。

2 个赞

貌似没什么数学含义,不过可以实现。

(defun my-vec-to-lst (vec)
  (mapcar (lambda (x)
            (list (cadadr x) (caddr x)))
          (cdr vec)))

(defun my-lst-to-vec (lst)
  `(vec ,@(mapcar
           (lambda (x)
             `(vec (var ,(car x) ,(intern (format "var-%s" (car x)))) 
                  ,(cadr x)))
           lst)))

(defun my-sub-lst (a b)
  (loop for x in a
        for z = (assoc (car x) b)
        if z collect (list (car x) (- (cadr x) (cadr z)))
        else collect x))

(defmath my-vsub (a b)
  (interactive 2 "my-vsub")
  (let* ((x (my-vec-to-lst a))
         (y (my-vec-to-lst b))
         (z (my-sub-lst x y)))
    (my-lst-to-vec z)))

然后就可以使用命令 calc-my-vsub (x my-vsub) 得到想要的结果。

(不小心搜到这里,手痒写之)