| descartes-src (ソースパッケージ descartes-src-0.26.0.tar.gz) | 2012-09-09 20:57 |
| descartes-win (Windows用バイナリパッケージ descartes-win-0.26.0.zip) | 2012-09-09 20:52 |
| 会話キャラクター: ツンデレ アプリケーション (会話キャラ:ツンデレ v1.0 for Windows) | 2010-04-29 13:41 |
| 会話キャラクター: 2人の女の子 ダブルキャラクター (会話キャラクター 2人の女の子 ダブルキャラクター 1.0 for Windows) | 2011-10-02 22:23 |
| 会話キャラクター: Eliza風英語版 (会話キャラ:Eliza風英語版 v1.0 for Windows) | 2010-05-11 01:06 |
| 会話キャラクター: 猫耳メイド アプリケーション (会話キャラ:猫耳メイド v1.0 for Windows) | 2010-04-27 21:15 |
| 会話キャラクター: イライザ風日本語版 (会話キャラ:イライザ風日本語版 v1.0 for Windows) | 2010-04-30 21:53 |
| 経済指標表示プログラム for Windows (経済指標表示プログラム V1.0) | 2011-08-18 22:04 |
| ニュースヘッドライン表示プログラム (ニュースヘッドライン表示プログラム V1.0 for Windows) | 2011-08-16 12:31 |
| デカルト言語 example (デカルト言語の例題 example-0.7.0.zip) | 2009-03-01 19:47 |
| 電力状況表示プログラム for Windows (2011年夏版 全国電力供給状況表示プログラム V1.0) | 2011-08-15 13:25 |
--
← 前のページに戻る
拡張版のDescartes Lisp/λインタプリターのソースを以下に示します。
/* Descartes Lisp/λ (c) 2010 H.Niwa */
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*/
? <include list>;
// s式の構文解析
<s_exp (quote #r)>
"'"
<s_exp #r>
;
<s_exp #r>
"λ"
<A #arg1>
<A #arg2>
<A #arg3>
[ "." ]
<s_exp #sexp>
(
<s_exp #parm1>
<s_exp #parm2>
<s_exp #parm3>
<is #r (("λ" (#arg1 #arg2 #arg3) #sexp) #parm1 #parm2 #parm3)>
|
<is #r ("λ" (#arg1 #arg2 #arg3) #sexp)>
)
//<print #r>
;
<s_exp #r>
"λ"
<A #arg1>
<A #arg2>
[ "." ]
<s_exp #sexp>
(
<s_exp #parm1>
<s_exp #parm2>
<is #r (("λ" (#arg1 #arg2) #sexp) #parm1 #parm2)>
|
<is #r ("λ" (#arg1 #arg2) #sexp)>
)
//<print #r>
;
<s_exp #r>
"λ"
<A #arg1>
[ "." ]
<s_exp #sexp>
(
<s_exp #parm1>
<is #r (("λ" (#arg1) #sexp) #parm1)>
|
<is #r ("λ" (#arg1) #sexp)>
)
//<print #r>
;
<s_exp #r>
"("
<x <print ::sys <line _> "syntax error : lack of ')'">>
{#r1
<s_exp _>
}
(
":" <s_exp #r2> ::list<append #r #r1 #r2>
|
<is #r #r1>
)
")"
|
<s_atom #r>
;
<s_atom #r>
(
<STRINGS #r>
|
<SNUM #r>
|
<WORD #r>
|
(
"+"
|
"*"
|
"/"
|
"="
|
"<>"
|
">="
|
">"
|
"<="
|
"<"
)
<GETTOKEN #r>
)
;
// 変数の処理
<var ((T : T) (NIL : NIL))>;
<getval #r #x ((#l1 :#l2) : #var)>
<is #x #l1>
<is #r #l2>
|
<getval #r #x #var>
;
<getval #x #x ()>
;
<setval #var () _ #var>
;
<setval #var3 (#x1 : #x2) (#val1 : #val2) #var>
<is #var1 ((#x1:#val1):#var)>
<setval #var3 #x2 #val2 #var1>
;
<setval ((#x : #val) : #var) #x #val #var>
;
<setval_let #var () #var>
;
<setval_let ((#x : #val) : #var2) ((#x #val) : #vals) #var>
<setval_let #var2 #vals #var>
;
// 組み込み関数
<built_in #l (quit) #var>
<exit>
;
<built_in #l (quote #l) #var>
;
<built_in #r (car #l) #var>
<l_eval #l1 #l #var> <car #r #l1>
;
<built_in #r (cdr #l) #var>
<l_eval #l1 #l #var> <cdr #r #l1>
;
<built_in #r (cons #l1 #l2) #var>
<l_eval #p1 #l1 #var>
<l_eval #p2 #l2 #var>
<cons #r #p1 #p2>
;
<built_in #r (atom #l) #var>
<l_eval #l1 #l #var> <atom #r #l1>
;
<built_in #r (equal #l1 #l2) #var>
<l_eval #ll1 #l1 #var>
<l_eval #ll2 #l2 #var>
<equal #r #ll1 #ll2>
;
<built_in #r (print :#l) #var>
<l_evpr #r #l #var>
;
<built_in #r (list :#l) #var>
<l_list #r #l #var>
;
<built_in #r ("+" #l1 #l2) #var>
<l_eval #ll1 #l1 #var>
<l_eval #ll2 #l2 #var>
( ::sys <isInteger #ll1> ::sys <isInteger #ll2>
<#r = #ll1 + #ll2>
| <is #r ("+" #ll1 #ll2)>)
;
<built_in #r ("-" #l1 #l2) #var>
<l_eval #ll1 #l1 #var>
<l_eval #ll2 #l2 #var>
( ::sys <isInteger #ll1> ::sys <isInteger #ll2>
<#r = #ll1 - #ll2>
| <is #r ("-" #ll1 #ll2)>)
;
<built_in #r ("*" #l1 #l2) #var>
<l_eval #ll1 #l1 #var>
<l_eval #ll2 #l2 #var>
( ::sys <isInteger #ll1> ::sys <isInteger #ll2>
<#r = #ll1 * #ll2>
| <is #r ("*" #ll1 #ll2)>)
<trace "*" ("*" #l1 #l2) ("*" #ll1 #ll2)>
;
<built_in #r ("/" #l1 #l2) #var>
<l_eval #ll1 #l1 #var>
<l_eval #ll2 #l2 #var>
( ::sys <isInteger #ll1> ::sys <isInteger #ll2>
<noteq #ll2 0>
<#r = #ll1 / #ll2>
| <noteq #ll2 0> <is #r ("/" #ll1 #ll2)>)
;
<built_in #r ("=" #l1 #l2) #var>
<x <print "error: = ">>
<l_eval #ll1 #l1 #var>
<l_eval #ll2 #l2 #var>
( ::sys <isInteger #ll1> ::sys <isInteger #ll2>
(
<compare #ll1 == #ll2> <is #r T>
| <is #r NIL>
)
| <is #r ("=" #ll1 #ll2)>)
;
<built_in #r ("<>" #l1 #l2) #var>
<x <print "error: <> ">>
<l_eval #ll1 #l1 #var>
<l_eval #ll2 #l2 #var>
( ::sys <isInteger #ll1> ::sys <isInteger #ll2>
(
<compare #ll1 <> #ll2> <is #r T>
| <is #r NIL>
)
| <is #r ("<>" #ll1 #ll2)>)
;
<built_in #r (">" #l1 #l2) #var>
<x <print "error: > ">>
<l_eval #ll1 #l1 #var>
<l_eval #ll2 #l2 #var>
( ::sys <isInteger #ll1> ::sys <isInteger #ll2>
(
<compare #ll1 > #ll2> <is #r T>
| <is #r NIL>
)
| <is #r (">" #ll1 #ll2)>)
;
<built_in #r (">=" #l1 #l2) #var>
<x <print "error: >= ">>
<l_eval #ll1 #l1 #var>
<l_eval #ll2 #l2 #var>
( ::sys <isInteger #ll1> ::sys <isInteger #ll2>
(
<compare #ll1 >= #ll2> <is #r T>
| <is #r NIL>
)
| <is #r (">=" #ll1 #ll2)>)
;
<built_in #r ("<" #l1 #l2) #var>
<x <print "error: < ">>
<l_eval #ll1 #l1 #var>
<l_eval #ll2 #l2 #var>
( ::sys <isInteger #ll1> ::sys <isInteger #ll2>
(
<compare #ll1 < #ll2> <is #r T>
| <is #r NIL>
)
| <is #r ("<" #ll1 #ll2)>)
;
<built_in #r ("<=" #l1 #l2) #var>
<x <print "error: <= ">>
<l_eval #ll1 #l1 #var>
<l_eval #ll2 #l2 #var>
( ::sys <isInteger #ll1> ::sys <isInteger #ll2>
(
<compare #ll1 <= #ll2> <is #r T>
| <is #r NIL>
)
| <is #r ("<=" #ll1 #ll2)>)
;
<built_in #r (define (#f :#x) #val) _>
<var #var>
<setval #var2 #f (λ #x #val) #var>
<setVar var #var2>
<is #r (λ #x #val)>
;
<built_in #r (define #x #val) #var>
<setval #var2 #x #val #var>
<setVar var #var2>
<is #r #val>
;
<built_in #r (let #v :#bodys) #var>
<x <print "error : " (let #v :#bodys) >>
<setval_let #var2 #v #var>
<l_evlis #r #bodys #var2>
;
<built_in #r (cond : #l) #var>
<cond #r #l #var>
<trace "cond " (cond : #l) #r>
;
<built_in #r (load #l) #var>
<loadlist #r #l #var>
;
<built_in on (trace on) #var>
<setVar tracemode on>
;
<built_in off (trace off) #var>
<setVar tracemode off>
;
// 組み込み関数の処理
<car #r #l>
::sys <isList #l>
::sys <car #r #l>
|
<is #r (car #l)>
;
<cdr #r #l>
::sys <isList #l>
::sys <cdr #r #l>
|
<is #r (cdr #l)>
;
<cons (#l1 :#l2) #l1 #l2>
;
<atom #r #n>
::sys <isAtom #n> <is #r T>
|
<is #r NIL>
;
<equal #r #l1 #l2>
<is #l1 #l2> <is #r T>
|
<is #r NIL>
;
<cond NIL () #var>
;
<cond #r ((#l1 : (#l2)) :#l3) #var>
<l_eval #r1 #l1 #var>
(
<is #r1 T>
<l_eval #r #l2 #var>
|
<is #r1 NIL>
<cond #r #l3 #var>
|
<is #r (cond : ((#l1 : (#l2)) :#l3))>
)
;
<listp #l>
::sys <isUnknown ::sys <isAtom #l>>
;
<loadlist #r #filename _>
::sys <openr #filename
{
";" <SKIPCR>
|
<var #var>
<s_exp #list>
<print "> " #list>
<l_eval #r #list #var>
<print #r><print>
{
")"
<print ::sys <line _> "syntax error : extra ')'">
}
}
>
<is #r T>
;
<tracemode off>;
<trace #id #func #val>
<tracemode off>
|
<print #id "trace : " #func>
<print " -> " #val><print>
;
// evalの処理
<l_eval #r #p #var>
::sys <isInteger #p>
<is #r #p>
|
::sys <isAtom #p>
<getval #r1 #p #var>
(
<is #r1 #p>
<is #r #r1>
|
<l_eval #r #r1 #var>
)
|
<built_in #r #p #var>
;
<l_eval #r (("λ" #arg #prog) :#parm) #var>
<l_evparm #parm2 #parm #var>
<setval #var2 #arg #parm2 #var>
<l_eval #r #prog #var2>
<trace "(λ)" (("λ" #arg #prog) :#parm) #r>
;
<l_eval ("λ" #arg #prog2) ("λ" #arg #prog) #var>
<setval #var2 #arg #arg #var>
<replace_var #prog2 #prog #var2>
<trace "λ" ("λ" #arg #prog) ("λ" #arg #prog2)>
;
<l_eval #r (#f :#arg) #var>
<l_eval #f2 #f #var>
(
<is #f2 NIL>
<is #r NIL>
| <noteq #f #f2>
<trace "eval " (#f :#arg) (#f2 : #arg)>
<l_eval #r (#f2 :#arg) #var>
|
<is #r (#f2 :#arg)>
)
;
<l_evlis () () #var>
;
<l_evlis #r (#l) #var>
<l_eval #r #l #var>
;
<l_evlis #r2 (#l1 : #l2) #var>
<l_eval #r1 #l1 #var>
<l_evlis #r2 #l2 #var>
;
<l_evlis #r #l #var>
;
<l_list () () #var>
;
<l_list (#r1 :#r2) (#l1 : #l2) #var>
<l_eval #r1 #l1 #var>
<l_list #r2 #l2 #var>
;
<l_list #l #l #var>
;
<l_evpr () () #var>
;
<l_evpr #r (#l) #var>
<l_eval #r #l #var>
<print #r>
;
<l_evpr #r2 (#l1 : #l2) #var>
<l_eval #r1 #l1 #var>
<printf #r1 " ">
<l_evpr #r2 #l2 #var>
;
<l_evpr #l #l #var>
;
<l_evparm () () #var>
;
<l_evparm ((quote :#l1) : #r2) ((quote :#l1) : #l2) #var>
<l_evlis #r2 #l2 #var>
;
<l_evparm (#r1 : #r2) (#l1 : #l2) #var>
<l_eval #r1 #l1 #var>
<l_evlis #r2 #l2 #var>
;
<replace_var #body2 (("λ" #arg #body) :#parm) #var>
<setval #var2 #arg #parm #var>
<replace_var #body2 #body #var2>
<trace "replace(λ)" (("λ" #arg #body) #parm) #body2>
;
<replace_var ("λ" #arg #body2) ("λ" #arg #body) #var>
<setval #var2 #arg #arg #var>
<replace_var #body2 #body #var2>
<trace "replace λ" ("λ" #arg #body) ("λ" #arg #body2) >
;
<replace_var (#new1 : #new2) (#old1 : #old2) #var>
<replace_var #new1 #old1 #var>
<replace_var #new2 #old2 #var>
;
<replace_var () () #var>
;
<replace_var #new #old #var>
::sys <isAtom #old>
<getval #new #old #var>
;
// LISPのメイン処理
<Lisp>
<print "Descartes Lisp/λ (c) 2010 H.Niwa">
{
<var #var>
<print Ready>
::sys <getline #line
(
";" <SKIPCR>
|
<NULLLINE>
|
<x <print "syntax error : " #line>>
<s_exp #list>
{
")"
<print ::sys <line _> "syntax error : extra ')'">
}
<l_eval #r #list #var>
<print #r>
)>
|
<print>
}
;
? <Lisp>;
[PageInfo]
LastUpdate: 2010-04-12 21:45:16, ModifiedBy: hniwa
[License]
Creative Commons 2.1 Attribution
[Permissions]
view:all, edit:login users, delete/config:login users