为什么lisp,或者说common lisp现在这么冷门呢?

传 struct 不是传指针?

喷了,那传什么不能传指针?语义上不还是传值?不把struct写出来,别的语言不可以这么干吗?

居然还有这种操作....

应该是编译器可以处理赋值运算左右为相同结构体的情况.

已经验证过了, main函数中的myA和foo中的myA是两个不同的地址.

typedef struct 
{
    int b;
    int c;
    int d;
    int e;
    int f;
    int g;
    char x;
} A;

A foo(int b, int c)
{
    A myA = {b, c, 5, 6, 7, 8, 10};
    return myA; 
}

int main()
{   
    A myA = foo(5,9);   
    return 0;
}

所以"只有在显式使用指针/手动管理內存的语言才能直接控制是否从栈上分配"有问題?


这就是从栈上分配不正確用法会产生的问題。

CL-USER> (let ((a (list 'a 'b 'c))
               (b '(1 2 3)))
           (declare (dynamic-extent a))
           (setq z (nconc a b))
               a)
(0 . 0)
CL-USER> z
(0 . 0)
CL-USER> (let ((a (list 'a 'b 'c))
               (b '(1 2 3)))
           (setq z (nconc a b))
               a)
(A B C 1 2 3)
CL-USER> z
(A B C 1 2 3)

这个操作是cpp标准规定的 copy elision

Omits copy and move (since C++11) constructors, resulting in zero-copy pass-by-value semantics

除了机器语言,所有的都应该是汇编语言的语法糖吧

语法糖本身或许并不重要 重要的是与外围(系统中的其它接口或协议)的交互

做好自己的事情或许很容易,因为你有决定权

与别人合作应该就没那么简单了吧

1 个赞

OBJ family 完全基于 reduction 和 term rewrite,立足于数学而独立于 Von Neumann 存在。

  op nil : -> List .
  op _._ : Qid List -> List 
  op length : List -> Nat .
  op _in_ : Qid List -> Bool .
  vars I J : Qid . 
  var L : List .
  eq length(nil) = 0 .
  eq length(I . L) = s length(L) .
  eq I in nil = false .
  eq I in J . L = (I == J) or (I in L) .

execution(reduction):

length(’a . ’b . ’c . nil) 
= s length(’b . ’c . nil) 
= s s length(’c . nil)
= s s s length(nil) 
= s s s 0

s 与 or 的 定义呢? List、nil是如何表示的?

s s s 0 的目的是什么呢? 还是执行多次的s(可以是一段代码)?

皮亚诺公理

  op _+_ : Nat Nat -> Nat .
  vars N M K : Nat .
  eq N + 0 = N .
  eq N + (s M) = s (N + M) .

reduction

s s 0 + s s s 0
=> s s s s s 0
**** 等价于
2 + 3 => 5

or 的定义

fmod BOOL-OPS is
  protecting TRUTH-VALUE .
  op _and_ : Bool Bool -> Bool [assoc comm prec 55] .
  op _or_ : Bool Bool -> Bool [assoc comm prec 59] .
  op _xor_ : Bool Bool -> Bool [assoc comm prec 57] .
  op not_ : Bool -> Bool [prec 53] .
  op _implies_ : Bool Bool -> Bool [gather (e E) prec 61] .
  vars A B C : Bool .
  eq true and A = A .
  eq false and A = false .
  eq A and A = A .
  eq false xor A = A .
  eq A xor A = false .
  eq A and (B xor C) = A and B xor A and C .
  eq not A = A xor true .
  eq A or B = A and B xor A xor B .
  eq A implies B = not(A xor A and B) .
endfm

这个语言沒有 eval 的概念,一切都是符號和语法树,根據預定的 rule 做 reduction。

定义 nil of Type List,定义 . 左邊类型是 Qid,右邊类型是 List,合起來类型是 List。那麼 'a . 'b . nil 就是个 List

eq N + (s M) = s (N + M) .

可以推导出

s s 0 + s s s 0  => s s s s s 0

但是

s s s s s 0    到底是什么呢?

s s s s s 0 就是代表自然数 5 了。为了方便也可以直接用 digits 5 代表这个。在这里用 s 是为了表現这个语言的本質和与其他语言的区別。

用 reduction 如何定义 s s s s s 0 -> 5 呢?

不要给概念 给段代码

这是语言实現层次上的 hack 了。语言的 parser 读到 32 就把它识別成 S32 0,就和 lambda calculus 的 church number 一樣。

我可不可以理解为 所谓的core language其实就是汇编语言

其它都是建立在汇编语言的基础之上

除了用汇编,还可以手工算。

其实还可以脑算 有几个人能比欧拉还强的吗

请问欧拉用过汇编嗎?


s 还是 1 实质上沒区別,尤其是对于一個很大的数。完全可以定义

op p X = s s s s s s s s s s X

这樣 p 0 就是十了。p p 0 就是 20。

不能解答"那麼 C++ 沒汇编怎麼运行"这个关鍵问題。

还是用 Ada Lovelace 用织布机编程的极端例子对这个问題有说服力。

对了,我还忘了 Hardware description language 这个直接生成硬件的大殺器。汇编是什麼玩意兒?不存在的。

VHDL 写出来的东西是给人用的 给人用就得提供接口

接口简单的意义不大,接口复杂的,不用汇编 还能用什么呢?

一个不可配置的硬件又有是什么用呢?

verilog 和C语言类似我知道

VHDL和什么语言类似我就不知道了