Skip to content

Commit

Permalink
整理相关安装信息,温固clojure学习过程
Browse files Browse the repository at this point in the history
  • Loading branch information
jueqingsizhe66 committed Nov 19, 2017
1 parent 585068c commit 2668a55
Show file tree
Hide file tree
Showing 10 changed files with 363 additions and 11 deletions.
2 changes: 1 addition & 1 deletion .orgConf.el
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ Captured %<%Y-%m-%d %H:%M>
("t" "Todo" entry (file+headline "~/.emacs.d/GTD/orgBoss/newgtd.org" "Tasks")
"* TODO [#B] %^{Task} %T %^g
:PROPERTIES:
:Effort: %^{effort|1:00|0:05|0:15|0:30|2:00|4:00}
:Effort: %^{effort|1:00|0:30|2:00|4:00|6:00|8:00|10:00|12:00|14:00|16:00}
:END:
%?
Expand Down
195 changes: 195 additions & 0 deletions GTD/orgBoss/Journal/20171103
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
星期五, 2017/11/3


* keep work with jounal (Good for you)
[[https://github.com/howardabrams/dot-files/blob/b2e8a36832d4b9964042aca839f3ff0a3e6724a7/emacs-org.org]]

[[https://github.com/jueqingsizhe66/ranEmacs.d]]

** 17:02 为什么要使用defmacro?

LISP里的宏之所以被称为宏,是因为它确实包装了很多步骤的操作,两大步:
第一步,像函数那样,宏的body对你传入宏的参数进行操作,进行处理,进行加工;注意,传入宏的参数,是不会被求值的。
第二步,第一步处理的结果,会被LISP-eval,也就是会被LISP执行;而在函数里,整个函数body的执行结果是不会被再次执行的。第二步的再次被执行,这种特性在动态生成代码中是非常OK的,第一步用来生成代码,第二步用来执行这段代码。为什么要动态生成代码呢?

动态变化的过程是data transformation的过程

可以到别的地方去执行,比如
(defmacro make-test(name body)
`(defun ,name ,body)
....)
需要定义测试加法的函数,就可以这样调用 ; (make-test test-+ body)
然后调用test-+

用来创建domain specific language. 换句话来说就是让你的语法更适合问题所在的domain.

Common Lisp的宏特别之处可能就在于能在run time之前多一层macro expansion time。宏扩展的时候可以把代码当作数据来处理,并可以控制宏参数的evalute次数、顺序等。依据这些特性可以用宏生成新的语法规则。写宏的时候要注意variable capture以及form参数的多次evalute.

(defmacro kv [& args]
`(let [args# (list ~@args)]
(zipmap (map #(keyword %) '(~@args)) args#)))


(defmacro defn-request [func-name api-key method & args]
`(defn ~func-name [~@args]
(url-request-jsonlize
(request-hof
~api-key
~method
(kv ~@args)))))
虽然不是common lisp, 但也是lisp方言(clojure).. 这是我用的比较舒服的宏.. 用参数定义request的发送函数 包括参数表之类的 外围用起来一个很舒服...




** 17:24 defmacro really generate the clojure expression

defmacro will not evaluate the parameter, but the body will evaluate some arguments with ~ and ~@ surround with `

Macro是函数式编程里面很重要的一个概念,在之前,我们已经使用了Clojure里面的一些macro,譬如when,and等,我们可以通过macroexpand获知:

user=> (macroexpand '(when true [1 2 3])))
(if true (do [1 2 3]))
user=> (doc when)
-------------------------
clojure.core/when
([test & body])
Macro
Evaluates test. If logical true, evaluates body in an implicit do.
nil

可以看到,when其实就是if + do的封装,很类似C语言里面的macro。
defmacro

我们可以通过defmacro来定义macro:

user=> (defmacro my-plus
#_=> "Another plus for a + b"
#_=> [args]
#_=> (list (second args) (first args) (last args)))
#'user/my-plus
user=> (my-plus (1 + 1))
2
user=> (macroexpand '(my-plus (1 + 1)))
(+ 1 1)

macro的定义比较类似函数的定义,我们需要定义一个macro name,譬如上面的my-plus,一个可选择的macro document,一个参数列表以及macro body。body通常会返回一个list用于后续被Clojure进行执行。

我们可以在macro body里面使用任何function,macro以及special form,然后使用macro的时候就跟函数调用一样。但是跟函数不一样的地方在于函数在调用的时候,参数都是先被evaluated,然后才被传入函数里面的,但是对于macro来说,参数是直接传入macro,而没有预先被evaluated。

我们也能在macro里面使用argument destructuring技术,进行参数绑定:

user=> (defmacro my-plus2
#_=> [[op1 op op2]]
#_=> (list op op1 op2))
#'user/my-plus2
user=> (my-plus2 (1 + 1))

Symbol and Value

编写macro的时候,我们其实就是构建list供Clojure去evaluate,所以在macro里面,我们需要quote expression,这样才能给Clojure返回一个没有evaluated的list,而不是在macro里面就自己evaluate了。也就是说,我们需要明确了解symbol和value的区别。

譬如,现在我们要实现这样一个功能,一个macro,接受一个expression,打印并且输出它的值,可能看起来像这样:

user=> (let [result 1] (println result) result)
1
1

然后我们定义这个macro:

user=> (defmacro my-print
#_=> [expression]
#_=> (list let [result expression]
#_=> (list println result)
#_=> result))

我们会发现出错了,错误为"Can't take value of a macro: #'clojure.core/let",为什么呢?在上面这个例子中,我们其实想得到的是let symbol,而不是得到let这个symbol引用的value,这里let并不能够被evaluate。

所以为了解决这个问题,我们需要quote let,只是返回let这个symbol,然后让Clojure外面去负责evaluate,如下:

user=> (defmacro my-print
#_=> [expression]
#_=> (list 'let ['result expression]
#_=> (list 'println 'result)
#_=> 'result))
#'user/my-print
user=> (my-print 1)
1
1

Quote
Simple Quoting

如果我们仅仅想得到一个没有evaluated的symbol,我们可以使用quote:

user=> (+ 1 2)
3
user=> (quote (+ 1 2))
(+ 1 2)
user=> '(+ 1 2)
(+ 1 2)
user=> '123
123
user=> 123
123
user=> 'hello
hello
user=> hello

CompilerException java.lang.RuntimeException: Unable to resolve symbol: hello in this context

Syntax Quoting

在前面,我们通过'以及quote了解了simple quoting,Clojure还提供了syntax quoting `

user=> `1
1
user=> `+
clojure.core/+
user=> '+
+

可以看到,syntax quoting会返回fully qualified symbol,所以使用syntax quoting能够让我们避免命名冲突。

另一个syntax quoting跟simple quoting不同的地方在于,我们可以在syntax quoting里面使用~来unquote一些form,这等于是说,我要quote这一个expression,但是这个expression里面某一个form先evaluate,譬如:

user=> `(+ 1 ~(inc 1))
(clojure.core/+ 1 2)
user=> `(+ 1 (inc 1))
(clojure.core/+ 1 (clojure.core/inc 1))

这里还需要注意一下unquote splicing:

user=> `(+ ~(list 1 2 3))
(clojure.core/+ (1 2 3))
user=> `(+ ~@(list 1 2 3))
(clojure.core/+ 1 2 3)

syntax quoting会让代码更加简洁,具体到前面print那个例子,我们let这些都加了quote,代码看起来挺丑陋的,如果用syntax quoting,如下:

user=> (defmacro my-print2
#_=> [expression]
#_=> `(let [result# ~expression]
#_=> (println result#)
#_=> result#))
#'user/my-print2
user=> (my-print2 1)
1
1



宏存在第二步,这是之前没注意到的,也就是在解释完macro body之后还得解释macro-expansion的内容(这是核心的内容)
让他变着花样地执行!经常会用到的技能是,参数的次序调换。(不求值阶段和求值阶段,两部分,但是说到不求值,也是可以求的
比如~x ~@(list...)---- 第一阶段code is data, 第二阶段data(list data) is code.

code->data->code->data->code...
eval->apply->eval->apply->eval...


how to uprade your thinking from function to macro?

如果真的是参数比如,红参数中x是5
但是你在宏body肯定使用的是5 如果你使用`(+ 4 x) 那么最后就会报错,你得获得x symbol的value,
这时候你就需要使用`(+ 4 ~x) 来执行了,这样你形成的表达式才是(+ 4 5) ,而不是(+ 4 x),他会报错的(在第二阶段中)
也就是宏的第一阶段具备c语言早先的文本替换功能,然后才是clojure升级版的对应地方做执行。
14 changes: 14 additions & 0 deletions GTD/orgBoss/Site/www.site.org
Original file line number Diff line number Diff line change
Expand Up @@ -231,3 +231,17 @@ emacs window 配置
* SITES
** http://dp.pconline.com.cn/dphoto/list_3365009.html
very beautiful picture about flowers
** https://github.com/matthiasn/Clojure-Resources
clojure resources
** https://www.clojure-toolbox.com/
clojure-toolbox做的相当不错,挺适合开发者寻找插件
** https://letoverlambda.com/
defun defmacro, a special book works for clojure macro transform
** http://www.hzwindpower.com/
中国海装 <2017-11-05 21:10> 已经能够生产海上型风力机171m
远景现在已经能够140m塔架 131m的风轮直径 2.2MW,市面上普遍的都是E120m
左右的风轮直径。
** https://www.icax.org/forum-324-1.html
SpaceClaim(Pidex简称)
** https://s-haensch.github.io/visual-cheatsheet/
可视化clojure核心函数
116 changes: 113 additions & 3 deletions GTD/orgBoss/newgtd.org
Original file line number Diff line number Diff line change
Expand Up @@ -462,24 +462,55 @@ SCHEDULED: <2017-10-28 周六>

我想说的是,番茄时间的核心是倒计时所产生的紧迫感。这是中科院心理学专业毕业的
老郭(郭军峰)告诉我的,感谢哦。
** TODO [#B] 工程热物理会议ppt <2017-11-01 周三 16:42> :@work:
DEADLINE: <2017-11-04 周六> SCHEDULED: <2017-11-01 周三>
** DONE [#B] 工程热物理会议ppt <2017-11-01 周三 16:42> :@work:jj
CLOSED: [2017-11-14 周二 14:30] DEADLINE: <2017-11-04 周六> SCHEDULED: <2017-11-01 周三>
:PROPERTIES:
:Effort: 4:00
:END:
- State "DONE" from "TODO" [2017-11-14 周二 14:30]
:LOGBOOK:
CLOCK: [2017-11-06 周一 12:52]--[2017-11-09 周四 17:54] => 77:02
CLOCK: [2017-11-06 周一 08:55]--[2017-11-06 周一 12:52] => 3:57
CLOCK: [2017-11-05 周日 15:41]--[2017-11-05 周日 18:16] => 2:35
CLOCK: [2017-11-04 周六 21:49]--[2017-11-05 周日 15:41] => 17:52
CLOCK: [2017-11-03 周五 11:22]--[2017-11-03 周五 11:22] => 0:00
CLOCK: [2017-11-01 周三 16:43]--[2017-11-01 周三 16:43] => 0:00
:END:


抓紧完成

今年海装的海上风力机达到的最大风轮直径
中国海装H171-5MW(江苏如东),大直径风轮正广泛运用于低风速和超低风速风场,

大悲:我关注的不是什么全球风轮直径最大,而是似乎有这么一个趋势,那就是大直径风轮不仅越来越多用于低风速超低风速市场,
而且也正越来越多用于海上。而且无论海上,还是低风速超低风速市场,同样直径风轮的风机,直驱机型的发电功率均明显高于
双馈机型。与海装推出H171-5MW机组几乎同步,金风最近在山东海上开始推介GW171/6.45MW风机,这意味着以往我们认为长江口
以北海域较为适合4MW风机,但如果叶轮直径逐步增大,则陆上4MW,5MW风机肯定会逐步普及,而海上很可能越过4MW风机,起步
就是5MW,甚至6MW,如此金风海上或许已无必要再研发6MW以下海上新型风机,而是直接从3MW跳到6MW平台,之后再向10MW平台迈进。具体如何,让我们且走且看!

http://dabei2006.blog.hexun.com/113493152_d.html 大悲金风科技


大家好,我叫叶昭良,本次我报告的论文题目是风力机的偏航
气动特性分析,报告的主题部分包含以下几个部分 背景和意义


*** 普遍存在的问题
随着风电机组大型化,叶片和塔架的柔性增加。前一阶段风轮的最大直径一直是
西门子164m风电机组,而今年8月份海装推出了171m的5MW海上风电机组,进一步
加大了风轮直径。在风力机变大的前提下,而中国地区的风力机大多处于山地地形中
,普遍存在着偏航入流和偏航入流

*** 气动设计问题
风力机的工程设计方法通常基于

** TODO [#B] 两圈风轮20 30 60收集 <2017-11-02 周四 20:48> :@work:
:PROPERTIES:
:Effort: 4:00
:END:
:LOGBOOK:
CLOCK: [2017-11-03 周五 11:22]
CLOCK: [2017-11-03 周五 11:22]--[2017-11-04 周六 16:41] => 29:19
CLOCK: [2017-11-02 周四 21:04]--[2017-11-03 周五 11:22] => 14:18
CLOCK: [2017-11-02 周四 21:00]--[2017-11-02 周四 21:04] => 0:04
CLOCK: [2017-11-02 周四 20:51]--[2017-11-02 周四 20:59] => 0:08
Expand All @@ -490,4 +521,83 @@ DEADLINE: <2017-11-04 周六> SCHEDULED: <2017-11-01 周三>
30-60 计算30°
WZ-YZL计算60°(180步 每隔2步保存一次)
Node7计算20°(BookYZL)
** TODO [#B] spaceClaim 参考 <2017-11-06 周一 12:52> :@work:
:PROPERTIES:
:Effort: 1:00
:END:
:LOGBOOK:
CLOCK: [2017-11-06 周一 12:52]--[2017-11-06 周一 12:52] => 0:00
:END:


http://help.spaceclaim.com/2017.0.0/zh-Hans/
花点时间思考
** TODO [#B] 实验(本科生创新实验) <2017-11-09 周四 17:53> :@work:
SCHEDULED: <2017-11-14 周二>
:PROPERTIES:
:Effort: 1:00
:END:
** TODO [#B] 机舱偏航绘制 <2017-11-15 周三 10:44> :@work:
:PROPERTIES:
:Effort: 4:00
:END:
:LOGBOOK:
CLOCK: [2017-11-15 周三 16:49]--[2017-11-16 周四 13:51] => 21:02
CLOCK: [2017-11-15 周三 11:07]--[2017-11-15 周三 16:48] => 5:41
CLOCK: [2017-11-15 周三 10:49]--[2017-11-15 周三 11:07] => 0:18
CLOCK: [2017-11-15 周三 10:44]--[2017-11-15 周三 10:44] => 0:00
:END:
** TODO [#B] 球形晃动网格绘制 <2017-11-15 周三 10:47> :@work:
:PROPERTIES:
:Effort: 10:00
:END:
:LOGBOOK:
CLOCK: [2017-11-15 周三 10:49]--[2017-11-15 周三 10:49] => 0:00
CLOCK: [2017-11-15 周三 10:47]--[2017-11-15 周三 10:47] => 0:00
:END:
** TODO [#B] 风洞试验NREL5MW 错误排除 <2017-11-15 周三 11:06> :@work:
:PROPERTIES:
:Effort: 6:00
:END:
:LOGBOOK:
CLOCK: [2017-11-15 周三 11:07]--[2017-11-15 周三 11:07] => 0:00
:END:
** TODO [#B] clojure学习 <2017-11-16 周四 13:52 +1d> :@F708:
:PROPERTIES:
:Effort: 1:00
:END:
:LOGBOOK:
CLOCK: [2017-11-16 周四 13:52]--[2017-11-16 周四 14:46] => 0:54
:END:


https://github.com/marshallshen/clojure-katas clojure-katas
我挺喜欢firefox 中的vimEx的y功能,复制当前的网址到剪贴板

https://www.braveclojure.com/writing-macros/
the macro has a name, an optional document string, an argument list
also a body, just like function. The body will almost return a list.

macro can be recursive and also use the rest arguments list with `& next`
** TODO [#B] 3页的报告 <2017-11-17 周五 13:05> :@work:
:PROPERTIES:
:Effort: 4:00
:END:
:LOGBOOK:
CLOCK: [2017-11-19 周日 21:49]
CLOCK: [2017-11-17 周五 13:06]--[2017-11-17 周五 13:15] => 0:09
:END:


有关Torque会议的相关内容 有关Energy的文章
有关你的工作内容
** TODO [#B] [50%]舍友属性约减程序 <2017-11-17 周五 13:22> :@office:
:PROPERTIES:
:Effort: 1:00
:END:
:LOGBOOK:
CLOCK: [2017-11-17 周五 13:22]--[2017-11-17 周五 13:23] => 0:01
:END:
1. [X] 其师姐多样本程序
2. [ ] 编写多属性程

22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,23 @@ and ubuntu, all valid for newer.
C-c [a-z] and F5~F9是专门预留给用户自定义快捷键的,所有的major和minor都应该遵守这一规范。
[key-binding-convention][45]


## 当前.emacs.d安装和使用方法

1. 打开git bash,` git clone https://github.com/jueqingsizhe66/ranEmacs.d` 下载当钱包,
windows放在`C:\Users\用户名\AppData\Roaming`,linux系统放在~目录下即可。因为init.el存在很多当前
系统的custom-face-variable信息,所以需要下载后将其删除对应expression的信息
2. 下载emacs工具 ,[emacs25-3.1][161]
3. 下载gnupg软件,[gnupg-for-win][162],配置相关密匙即可,进一步参考[标题66][150]
4. 下载aspell 软件,已经在customization目录下,解压缩到`C:\Program Files (x86)\Aspell`即可,Aspell下一级目录为bin,data等,已包含对应字典(所以windows很方便),注意aspell的配置信息存放在.orgConf.el中。
5. clojure配置
5.1 安装[java-se-9.0.1开发包][163]
5.2 搜索leiningen或者boot-cli,当前搜索[leiningen][164],并安装对应的lein.bat
`C:\Windows\System32`,然后执行`lein self-install`即可,进一步可以参考我写的[emacs和clojure安装教程For ubuntu和windows][39]

截止到2017.11.19所用到的配件都在[emacs百度云][165],方便大家使用。另有一本the joy
of the clojure电子书.

### 1.为了引入clj-refactor(一个好用的补全包的工具)

click [clj-refactor][2]
Expand Down Expand Up @@ -2513,3 +2530,8 @@ org-mode是一个超级好的gtd工具,每天都利用它帮你完成事情,
[158]:https://rustbyexample.com/
[159]:https://github.com/kwrooijen/cargo.el
[160]:https://github.com/jueqingsizhe66/ranEmacs.d/blob/develop/customizations/img/clock-in.png
[161]:http://mirrors.ustc.edu.cn/gnu/emacs/windows/
[162]: https://www.gpg4win.org/download.html
[163]:http://www.oracle.com/technetwork/java/javase/downloads/index.html
[164]:https://leiningen.org/
[165]:http://pan.baidu.com/s/1nvoo3DR
Loading

0 comments on commit 2668a55

Please sign in to comment.