今天风好大,害我骑车上班路上眼睛里进了不少沙子...台风貌似临近了。
今天头过来找我谈了谈,大概了解了我这几天的进度(其实是没有进度,工作环境才刚刚搭建起来)。然后又给我大概讲了一些工作流程的事情,让我了解了不少。更重要的是,告诉我问问题的方式,有问题尽量在周围的同事那里解决,尤其是一些弱智的问题(比如,怎么在opengl里做blending,寒-_-|||)不要随便骚扰总部的同事...记住一点,大家都很忙...看来那篇《提问的智慧》应该好好看看了:-p
另一个问题是看代码,多用跟踪,理解代码是怎么工作的很重要。看代码是我的弱项,应该加强(注:经过这次实习,自己感觉看代码的能力是大大加强了)。
明天回杭州搬电脑。
外面的风还呜呜的吹...睡觉了...
附注:
提问的智慧(中文版)
http://www.linuxforum.net/doc/smartq-grand.html
2007年3月8日星期四
unix2dos in Emacs
参考了这个blog里的实现方式
(defun unix-dos () (interactive)
(let ((current-buffer-file-name buffer-file-name))
(goto-char (point-min))
(while (search-forward "\n" nil t) (replace-match "\r\n"))
(save-buffer)
(kill-buffer nil)
(find-file current-buffer-file-name)))
2007年3月1日星期四
2007年2月21日星期三
define-syntax的实现
(define-sytax foo
()
(syntax-rules
((foo a b) (+ (car a) b))
))
(foo '(1 2 3) 3)
;; a -> '(1 2 3)
;; b -> 3
这是一个很简单的模型。
pattern (foo a b)可以用来生成一个parser,方法如下
parser_syntax_foo = do或者可以封装在Monad中:
parser_left_par
parser_foo
a <- parser_a -- :: Parser Binding
b <- parser_b -- :: Parser Binding
parser_right_par
return $ a ++ b
-- Binding: 用来描述宏替换时宏参数和替换文本之间对应关系
parser_syntax_foo = dotemplate (+ (car a) b))
parser_left_par
parser_foo
parser_a -- :: Parser ()
parser_b -- :: Parser ()
parser_right_par
...
用前面得到的参数对应的替换文本进行替换
...
genCode template
...
其中genCode :: Template -> Parser Expr
Binding已经封装在Monad中
pattern可以生成一个parser的表([Parser ()])用mapM_来跑一遍
于是可以写成
在顶层的Parser里封装了一个宏函数(foo)和对应的Parser之间的绑定关系。
parser_syntax_foo :: Pattern -> Template -> Parser Expr
parser_syntax_foo pattern template = do
mapM_ (genParsers pattern)
genCode template
Parser根据实际遇到的调用进行分派
订阅:
博文 (Atom)