| 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 #r>
"'"
<s_exp #r1>
<is #r (quote #r1)>
;
<s_exp (("λ" (#arg1 #arg2 #arg3) #sexp) #parm1 #parm2 #parm3)>
"λ"
<A #arg1>
<A #arg2>
<A #arg3>
<s_exp #sexp>
<s_exp #parm1>
<s_exp #parm2>
<s_exp #parm3>
// <print (("λ" (#arg1 #arg2 #arg3) #sexp) #parm1 #parm2 #parm3)>
;
<s_exp ("λ" (#arg1 #arg2 #arg3) #sexp) >
"λ"
<A #arg1>
<A #arg2>
<A #arg3>
<s_exp #sexp>
// <print ("λ" (#arg1 #arg2 #arg3) #sexp)>
;
<s_exp (("λ" (#arg1 #arg2) #sexp) #parm1 #parm2)>
"λ"
<A #arg1>
<A #arg2>
<s_exp #sexp>
<s_exp #parm1>
<s_exp #parm2>
// <print (("λ" (#arg1 #arg2) #sexp) #parm1 #parm2)>
;
<s_exp ("λ" (#arg1 #arg2) #sexp) >
"λ"
<A #arg1>
<A #arg2>
<s_exp #sexp>
// <print ("λ" (#arg1 #arg2) #sexp)>
;
<s_exp (("λ" (#arg1) #sexp) #parm1)>
"λ"
<A #arg1>
<s_exp #sexp>
<s_exp #parm1>
// <print (("λ" (#arg1) #sexp) #parm1)>
;
<s_exp ("λ" (#arg1) #sexp) >
"λ"
<A #arg1>
<s_exp #sexp>
// <print ("λ" (#arg1) #sexp)>
;
<s_exp #r>
<s_atom #r>
|
"("
{#r1
<s_exp _>
}
(
":" <s_exp #r2> ::list<append #r #r1 #r2>
|
<is #r #r1>
)
")"
;
<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>
;
// 組み込み関数
<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 NIL (print #l) #var>
<l_eval #r1 #l #var> <print #r1>
;
<built_in #r ("+" #l1 #l2) #var>
<x <print "error: + ">>
<l_eval #ll1 #l1 #var> ::sys <isInteger #ll1>
<l_eval #ll2 #l2 #var> ::sys <isInteger #ll2>
<#r = #ll1 + #ll2>
;
<built_in #r ("-" #l1 #l2) #var>
<x <print "error: - ">>
<l_eval #ll1 #l1 #var> ::sys <isInteger #ll1>
<l_eval #ll2 #l2 #var> ::sys <isInteger #ll2>
<#r = #ll1 - #ll2>
;
<built_in #r ("*" #l1 #l2) #var>
<x <print "error: * ">>
<l_eval #ll1 #l1 #var> ::sys <isInteger #ll1>
<l_eval #ll2 #l2 #var> ::sys <isInteger #ll2>
<#r = #ll1 * #ll2>
;
<built_in #r ("/" #l1 #l2) #var>
<x <print "error: / ">>
<l_eval #ll1 #l1 #var> ::sys <isInteger #ll1>
<l_eval #ll2 #l2 #var> ::sys <isInteger #ll2>
<#r = #ll1 / #ll2>
;
<built_in #r ("=" #l1 #l2) #var>
<x <print "error: = ">>
<l_eval #ll1 #l1 #var> ::sys <isInteger #ll1>
<l_eval #ll2 #l2 #var> ::sys <isInteger #ll2>
( <compare #ll1 == #ll2> <is #r T>
| <is #r NIL>)
;
<built_in #r ("<>" #l1 #l2) #var>
<x <print "error: <> ">>
<l_eval #ll1 #l1 #var> ::sys <isInteger #ll1>
<l_eval #ll2 #l2 #var> ::sys <isInteger #ll2>
( <compare #ll1 <> #ll2> <is #r T>
| <is #r NIL>)
;
<built_in #r (">" #l1 #l2) #var>
<x <print "error: > ">>
<l_eval #ll1 #l1 #var> ::sys <isInteger #ll1>
<l_eval #ll2 #l2 #var> ::sys <isInteger #ll2>
( <compare #ll1 > #ll2> <is #r T>
| <is #r NIL>)
;
<built_in #r (">=" #l1 #l2) #var>
<x <print "error: >= ">>
<l_eval #ll1 #l1 #var> ::sys <isInteger #ll1>
<l_eval #ll2 #l2 #var> ::sys <isInteger #ll2>
( <compare #ll1 >= #ll2> <is #r T>
| <is #r NIL>)
;
<built_in #r ("<" #l1 #l2) #var>
<x <print "error: < ">>
<l_eval #ll1 #l1 #var> ::sys <isInteger #ll1>
<l_eval #ll2 #l2 #var> ::sys <isInteger #ll2>
( <compare #ll1 < #ll2> <is #r T>
| <is #r NIL>)
;
<built_in #r ("<=" #l1 #l2) #var>
<x <print "error: <= ">>
<l_eval #ll1 #l1 #var> ::sys <isInteger #ll1>
<l_eval #ll2 #l2 #var> ::sys <isInteger #ll2>
( <compare #ll1 <= #ll2> <is #r T>
| <is #r NIL>)
;
<built_in #r (define (#f :#x) #val) #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>
::sys <car #f #x>
<is #r #val>
;
<built_in #r (cond : #l) #var>
<cond #r #l #var>
;
// 組み込み関数の処理
<car #r #l>
::sys <car #r #l>
|
<is #r NIL>
;
<cdr #r #l>
::sys <cdr #r #l>
|
<is #r NIL>
;
<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>
<noteq #r1 NIL>
<l_eval #r #l2 #var>
;
<cond #r ((#l1 : (#l2)) :#l3) #var>
<cond #r #l3 #var>
;
<cond NIL ((#l1 : (#l2)) :#l3) #var>
<print "error : cond " ((#l1 : (#l2)) :#l3)>
;
// evalの処理
<l_eval #r (("λ" #arg #prog) :#parm) #var>
<l_evlis #parm2 #parm #var>
<setval #var2 #arg #parm2 #var>
<l_eval #r #prog #var2>
|
<print "eval error : " (("λ" #arg #prog) :#parm)>
;
<l_eval #r #p #var>
::sys <isInteger #p>
<is #r #p>
|
::sys <isAtom #p>
<getval #r #p #var>
|
<built_in #r #p #var>
|
::sys <car #f #p>
::sys <cdr #arg #p>
<l_eval #f2 #f #var>
( <is #f "λ"> <print "syntax error : λ"> <is #r NIL>
| <is #f2 NIL> <is #r NIL>
| <noteq #f #f2> <l_eval #r (#f2 :#arg) #var>
| <print "error " #p> <is #r NIL>)
;
<l_evlis () () #var>
;
<l_evlis (#r1 : #r2) (#l1 : #l2) #var>
<l_eval #r1 #l1 #var>
<l_evlis #r2 #l2 #var>
;
// LISPのメイン処理
<Lisp>
<print "Descartes Lisp/λ (c) 2010 H.Niwa">
{
<var #var>
<print Ready>
::sys <getline #line
( <NULLLINE>
|
<x <print "syntax error : " #line>>
<s_exp #list>
<l_eval #r #list #var>
<print #r>
)>
|
<print>
}
;
? <Lisp>;
[PageInfo]
LastUpdate: 2010-04-10 11:37:37, ModifiedBy: hniwa
[License]
Creative Commons 2.1 Attribution
[Permissions]
view:all, edit:login users, delete/config:login users