星期三, 十二月 29, 2010

ECL 10.4.1 在window 用 mingw 3.4.5 编译

ECL 10.4.1 compile under mingw for window.

first download gc 7.2
http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gc-7.2alpha4.tar.gz
展开。
然后进入msys
cd d:/gc-7.2alpha4
敲入命令:
1.首先配置
./configure --enable-shared=no --enable-static=yes --enable-cplusplus --enable-large-config --enable-parallel-mark --enable-threads=win32;make
2.开始编译
 make
3.安装到/usr/local目录下,实际的msys local目录下

success then.

cd d:/ecl-10.4.1
//./configure --prefix=/usr/local  --enable-boehm=system --enable-longdouble --enable-gengc --enable-precisegc --enable-threads --enable-unicode  CPPFLAGS=-ID:\\gc-7.2alpha4\\include LDFLAGS=-LD:\\gc-7.2alpha4\\.libs
make clean;./configure --prefix=/usr/local --enable-threads -enable-boehm  --enable-unicode ;make

MSVC:
nmake ECL_UNICODE=1 ECL_DEBUG=0

#include <ecl/ecl.h>
# include <unistd.h>
# include <pthread.h>
int main(int argc, char **argv)  {
  cl_boot(argc, argv);
  cl_object obj=c_string_to_object("\"
Hello world\"");
  cl_pprint(1,obj);
  cl_shutdown();
}
(ext::stream-external-format-
set *standard-input* :utf-8)
(ext::stream-external-format-
set *standard-output* :utf-8)

--build=pentium4-pc-mingw32
如何使用ecl.dll
使用
ecl-config --cflagsecl-config --ldflags 得到你需要传递给你的编译器的变量

发布使用ecl.dll的程序。
必须包含ecl.dll 和ucd.dat 两个文件同执行文件在同一个目录下

ucd.dat
显示汉字:

 cl_object obj=c_string_to_object("\"
Hello world你好\"");
   wxMessageBox(wxString(ecl_
base_string_pointer_safe(obj),wxConvUTF8));

ECL生成独立的可执行文件.
1.新建hello.lisp文件,包含如下代码
  (princ "Hello world!")
 (terpri)
 (quit)
2.生成object文件
(compile-file "hello.lisp" :system-p t) 
3.link成可执行文件
 (c:build-program "hello" :lisp-files '("hello.o"))

4../hello.exe


星期四, 十二月 23, 2010

如何用一个字符串作为Lisp Hashtable的key?

Lisp Hashtable默认的比较是用equa 函数,更换比较函数即可。

(setq table (make-hash-table)) =>  #<HASH-TABLE EQL 0/120 46142754>
 (setf (gethash "one" table) 1) =>  1
 (gethash "one" table) =>  NIL, false

 (setq table (make-hash-table :test 'equal)) =>  #<HASH-TABLE EQUAL 0/139 46145547>
 (setf (gethash "one" table) 1) =>  1
 (gethash "one" table) =>  1, T
 (make-hash-table :rehash-size 1.5 :rehash-threshold 0.7)

Lisp 如何得到函数返回的多个值?

 LISP很多函数返回几个值,默认是得到第一个值。其他的返回值如何得到呢?
比如parse-integer 返回2个值。
如果想的到第二个返回值,可以用(nth-value (parse-integer "20") 1)
得到2,字符串索引。

还有其他函数可以得到所有返回值。

 nth-value [already mentioned and only pertaining to multiple-vals]
 multiple-value-bind [no such thing as multiple-value-let]
 multiple-value-call
 multiple-value-setq
(multiple-value-list (floor 5 2))
得到:(2 1)

星期一, 十二月 20, 2010

Lisp打开跟踪,输出到log文件

(dribble  "c:\\temp\\output.txt") ;打开跟踪文件,所有输出都定位到c:\temp\output.text
(dribble) ;关闭跟踪输出。



星期二, 十二月 14, 2010

健身一次负重的重量如何计算?(比如哑铃,杠铃)

首先要得出你最大能举出的重量。(1RM)
Repetition Maximum
有两个公式可以计算得出1RM的重量:

Brzycki's 公式

  • 重量÷ ( 1.0278 - ( 0.0278 × 重复次数 ) )

另外一个系数的公式

  • 重量 × ( 1 + ( 0.033 × 重复次数 ) )

这样一个体重80公斤的人计划一组重复锻炼动作16次计算得出的1RM是:
Brzycki结果:137公斤
          另外:122公斤

然后利用另外一张 负重和重复 关系表。

   14 to 20RM = 60% of 1RM
    11 to 14RM = 70% of 1RM
    6 to 11RM = 80% of 1RM
    3 to 6RM = 90% of 1RM

得到重复16次相当于60%的 1RM 及137 × 0.6 =82.2 公斤或122* 0.6 = 73.2 公斤
这样就得出每次重复需要举起的实际总量为:82.2/16=5.1375公斤 或73.2/16=4.575公斤

所以锻炼的次数越多,每次需要举起的重量越少。
 
如果你是哑铃锻炼的话,一个体重80KG的人需要准备一个单只 2.5KG的哑铃或杠铃来举重。

% 重量 重复次数 % 重量 重复次数 % 重量
重复次数
60 17 75 10 90 5
65 14 80 8 95 3
70 12 85 6 100 1


实际锻炼中往往根据自己的目的来调整实际重复的次数或RM,这个同锻炼的目的有关系。
下面的表是肌肉锻炼目的和RM的关系,可以自己选择,然后确定实际的重量

    1RM的到3RM - 最大刺激神经肌肉力量
    
4RM以6RM -   最大强度的刺激肌肉肥大
    
6RM到12RM -  肌肉(肥大)力量锻炼合适
    
12RM到20RM - 肌肉体积良好和获得良好的耐力


一个比较好的LISP IDE 工具 lispIDE

下载:http://www.daansystems.com/lispide/
这个同居可以同SBCL Download - Steel Bank Common Lisp 配合一起使用


如图:
第一次运行lispIDE的时候,需要你指定LISP 解释器的位置,如果使用的SBCL
在需要首先新建一个sbcl.bat文件,里面包含如下语句:
D:\sbcl\1.0.37\sbcl.exe --core d:\sbcl\1.0.37\sbcl.core
然后再LISPIDE菜单中选择 Settings /Set Lisp Path指向这个sbcl.bat
则出现上面的运行界面。



星期五, 十二月 10, 2010

动态扩展的数组

如何定义个二维数组。代码

(defvar foo (make-array 1 :fill-pointer 0))
(vector-push-extend (vector 1 2 3) foo)
(vector-push-extend (vector 1 2 3) foo)