我正在涉足clojure,并且在尝试确定与这种常见python成语相当的clojure(和/或Lisp)方面遇到了一些麻烦.
习惯用法是在python模块的底部经常有一些测试代码,然后是运行代码的语句,例如:
# mymodule.py
class MyClass(object):
"""Main logic / code for the library lives here"""
pass
def _runTests():
# Code which tests various aspects of MyClass...
mc = MyClass() # etc...
assert 2 + 2 == 4
if __name__ == '__main__': _runTests()
Run Code Online (Sandbox Code Playgroud)
这对于简单的临时测试很有用.通常会通过写入来使用此模块from mymodule import MyClass,在这种情况下_runTests()永远不会调用,但是在末尾使用代码片段,也可以通过python mymodule.py直接从命令行键入来运行它.
在Clojure(和/或常见的lisp)中是否有相同的习惯用法?我不是在一个完整的单元测试库之后(好吧,我,但不是在这个问题中),我只想在一个模块中包含一些代码,这些代码只能在某些情况下运行,所以我可以拥有一种快速运行代码的方法我一直在努力,但仍允许我的文件像普通模块/命名空间一样导入.
我试图更好地掌握类型如何在lambda演算中发挥作用.不可否认,许多类型理论的东西都在我的头上.Lisp是一种动态类型语言,大致对应于无类型lambda演算?还是有一种我不知道的"动态类型的lambda演算"?
这是我的功能:
(defun MyFunction(input)
(let ((NEWNUM (find input num)))
(if (find input num) //if this
(setq num NEWNUM) (FUNCT2) //then execute both of these
(list 'not found)))) //else output this
Run Code Online (Sandbox Code Playgroud)
所以在if声明之后我希望能够执行,(setq num NEWNUM)然后(FUNCT2)设置一个新变量,然后调用一个函数.关于如何做到这一点的任何想法?
我正在寻找一本编译器设计书.我在大学里学习; 但讲座对我来说从未意味着什么.而且,在我的大学里,他们并没有做太多实际的工作,我相信即使我真诚地完成有限自动机和编译器设计的课程,我也不知道如何实现编译器.所以,我正在寻找有关实现编译器的书籍.我发现"现代编译器实现"很好.它有三种语言选择,我选择了C书,因为C是一种小语言,我会做更多的事情,在做的过程中学习更多.但是,我想学习为Lisp或python设计编译器的课程[也可能使用相同的语言]; 但我找不到太多可用的资料.Lisp是一种古老的语言,应该有一些关于为它设计编译器的文档.
谢谢.
在Lisp中,任何程序的代码实际上都是有效的数据结构.例如,这会将一个和两个加在一起,但它也是三个项目的列表.
(+ 1 2)
Run Code Online (Sandbox Code Playgroud)
这提供了什么好处?是什么让你在其他语言中做到不可能和/或不那么优雅?
嘿,我一直在寻找在我的框架中添加脚本语言的可能性,我听说过Lisp并认为我会试一试.有没有像Lua和Python这样的Lisp VM,或者我的思维方式错误.我在这里找到了CLISP,http: //clisp.cons.org/ ,但我不确定这是否是我要找的.
谁能指出我正确的方向?
我在书中读到:"编程的主人",与Guido Van Rossum的访谈说:
Python与Lisp共享的基本属性(也不是函数式语言!)是函数是一流的对象 ......
那么,Lisp 不是一种函数式编程语言?
圭多错了吗?之后怎么样了?
我在emacs lisp中有一个列表:
(setq a1
'((:k1 . 1)
(:k2 . 2)
(:k3 . 3)))
Run Code Online (Sandbox Code Playgroud)
我想将值改为:k1到10,就像(:k1 . 10).我怎么做?
我试过(setf (assoc :k1 a1) '(:k1 . 10))- 它没用.
LISP具有setf为变量赋值的功能.现在我一直想知道函数的名称:set部分很明显,但f后缀代表什么?