nendo 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/bin/nendo CHANGED
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # nendo - "interpretter main program"
5
5
  #
6
- # Copyright (c) 2000-2010 Kiyoka Nishiyama <kiyoka@sumibi.org>
6
+ # Copyright (c) 2009-2010 Kiyoka Nishiyama <kiyoka@sumibi.org>
7
7
  #
8
8
  # Redistribution and use in source and binary forms, with or without
9
9
  # modification, are permitted provided that the following conditions
@@ -36,45 +36,114 @@
36
36
  #
37
37
  require 'nendo'
38
38
  require 'getoptlong'
39
+ #require 'profile'
40
+
41
+ def userOptionEater
42
+ i = 0
43
+ while ( i < ARGV.length )
44
+ case ARGV[i]
45
+ when '-h'
46
+ i += 1
47
+ when '-q'
48
+ i += 1
49
+ when '-c'
50
+ i += 1
51
+ when '-l'
52
+ i += 2
53
+ when /^[^-]/
54
+ break
55
+ else
56
+ break
57
+ end
58
+ end
59
+ userOptions = ARGV.clone[i..ARGV.length]
60
+ userOptions.length.times { |x|
61
+ ARGV.pop
62
+ }
63
+ return userOptions
64
+ end
65
+
66
+ def cache_exist?( fn )
67
+ dotdir_path = File.expand_path( "~/.nendo" )
68
+ cache_path = File.expand_path( "~/.nendo/cache" )
69
+ Dir.mkdir( dotdir_path ) unless File.exist?( dotdir_path )
70
+ Dir.mkdir( cache_path ) unless File.exist?( cache_path )
71
+ sha1 = Digest::SHA1.hexdigest( File.expand_path( fn ))
72
+ cache_name = cache_path + "/" + sha1 + "_" + File.basename( fn ) + ".rb"
73
+ if File.exist?( cache_name )
74
+ [ true, cache_name ]
75
+ else
76
+ [ false, cache_name ]
77
+ end
78
+ end
39
79
 
40
80
  def main
41
- loadInit = true
81
+ loadInit = true
82
+ compile = false
83
+ conflict = 0
42
84
  core = Nendo.new()
43
85
 
86
+ userOptions = userOptionEater
44
87
  opts = GetoptLong.new(
45
- [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
46
- [ '--no-init-file', '-q', GetoptLong::NO_ARGUMENT ],
47
- [ '--load', '-l', GetoptLong::REQUIRED_ARGUMENT ]
88
+ [ '-h', GetoptLong::NO_ARGUMENT ],
89
+ [ '-q', GetoptLong::NO_ARGUMENT ],
90
+ [ '-c', GetoptLong::NO_ARGUMENT ],
91
+ [ '-l', GetoptLong::REQUIRED_ARGUMENT ]
48
92
  ).each { |opt, arg|
49
93
  case opt
50
- when '--help'
94
+ when '-h'
51
95
  puts <<-EOF
52
96
 
53
97
  nendo [OPTION] [script-file]
54
98
 
55
- -h, --help:
99
+ -h:
56
100
  show help
57
101
 
58
- -q, --no-init-file:
102
+ -q:
59
103
  Does not read the default initialization file.
60
104
 
61
- -l, --load:
62
- Does not read the default initialization file.
105
+ -l file:
106
+ load nendo script files. ( can specify n times like -l a.nnd -l b.nnd )
107
+
108
+ -c:
109
+ compile nendo script file. (and initialization file was loaded)
63
110
 
64
111
  EOF
65
- when '--no-init-file'
112
+ exit 0
113
+ when '-q'
66
114
  loadInit = false
67
- when '--load'
115
+ conflict += 1
116
+ when '-c'
117
+ loadInit = true
118
+ compile = true
119
+ conflict += 1
120
+ when '-l'
68
121
  core.load( arg )
69
122
  STDERR.printf( "loaded file [%s]\n", arg )
70
123
  end
71
124
  }
125
+
126
+ if 2 <= conflict
127
+ STDERR.puts( "Error: Can't specify both -q and -c ...\n" )
128
+ exit( 1 )
129
+ end
72
130
 
73
131
  if loadInit
74
132
  core.loadInitFile
75
133
  end
76
- if 0 < ARGV.length
77
- core.load( ARGV[0] )
134
+ if 0 < userOptions.length
135
+ fn = userOptions[0]
136
+ if compile
137
+ # compile script file.
138
+ core.clean_compiled_code( )
139
+ core.load( fn )
140
+ core.replStr( sprintf( '(print-compiled-code "%s")', fn ))
141
+ else
142
+ # start script file.
143
+ core.setArgv( userOptions[1..userOptions.length] )
144
+ core.load( fn )
145
+ core.replStr( "(if (and (global-defined? 'main) (procedure? main)) (main *argv*) #f)" )
146
+ end
78
147
  else
79
148
  core.repl
80
149
  end
data/emacs/nendo-mode.el CHANGED
@@ -4,6 +4,12 @@
4
4
  ;; Copyright (c) 2010 Kiyoka Nishiyama
5
5
  ;;
6
6
  ;;
7
+ ;; Please add follows to .emacs
8
+ ;; (setq scheme-program-name "nendo")
9
+ ;; (autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t)
10
+ ;; (autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t)
11
+ ;; (require 'nendo-mode)
12
+
7
13
 
8
14
  (require 'comint)
9
15
  (require 'cmuscheme)
@@ -42,6 +48,7 @@
42
48
  "Major mode for editing nendo code.
43
49
  Editing commands are similar to those of 'scheme-mode'."
44
50
  (make-local-variable 'scheme-buffer)
51
+ (modify-coding-system-alist 'process "nendo" '(utf-8 . utf-8))
45
52
  (local-set-key "\C-c\C-e" 'nendo-send-definition)
46
53
  (local-set-key "\C-x\C-e" 'nendo-send-last-sexp))
47
54
 
@@ -15,19 +15,23 @@
15
15
  (define font-list `(
16
16
  ("1" "ゴシック" ,(+ fontbase "ipagp.ttf"))
17
17
  ("2" "明朝" ,(+ fontbase "ipamp.ttf"))
18
+ ("3" "あんず" ,(+ fontbase "APJapanesefont.ttf"))
18
19
  ))
19
20
  (define default-fonttype 2)
20
21
 
21
22
  (define default-wording "デカ文字")
22
23
  (define default-size 2)
23
24
  (define size-list '(
24
- (1 . "サイズ小")
25
- (2 . "サイズ中")
26
- (3 . "サイズ大")
27
- (4 . "サイズ特大")
25
+ (1 . "サイズ極小")
26
+ (2 . "サイズ小")
27
+ (3 . "サイズ中")
28
+ (4 . "サイズ大")
29
+ (5 . "サイズ特大")
28
30
  ))
29
31
 
30
32
  (define (response-dekamoji str pointsize fontpath)
33
+ (define (blur image width)
34
+ (image.blur_channel 0 width Magick::AllChannels))
31
35
  (let* ((font-dots pointsize)
32
36
  (margin (* pointsize 0.3))
33
37
  (tmp-image (Magick::Image.new 1 1))
@@ -42,30 +46,46 @@
42
46
  (set! dr.fill "#777799")
43
47
  (set! dr.stroke "#8888AA")
44
48
  (dr.annotate image1 0 0 5 5 str)
45
- (let* ((image2 (image1.blur_channel 0 3 Magick::AllChannels)))
49
+ (let* ((image2 (blur image1 3)))
46
50
  (set! dr.fill "#111111")
47
51
  (set! dr.stroke "#606060")
48
52
  (dr.annotate image2 0 0 0 0 str)
49
- (image2.to_blob)))))
53
+ (let1 image3 (blur image2 0.5)
54
+ (image3.to_blob))))))
50
55
 
51
56
 
52
- (define (top-page params)
53
- (define (calc-limit min val max)
54
- (let* ((val (if (< val min) min val))
55
- (val (if (< max val) max val)))
56
- val))
57
+ ;; -----------------------------------
58
+ ;; encode & decode
59
+ ;; -----------------------------------
60
+ (define (encode-wording wording)
61
+ (string-join
62
+ (map
63
+ (lambda (x)
64
+ (+ "%" (sprintf "%02X" x)))
65
+ (to-list (wording.unpack "C*")))
66
+ ""))
67
+
68
+ (define (decode-wording enc-str)
69
+ (let1 hex-str (enc-str.gsub "%" "")
70
+ (. (. (list hex-str) to_arr) pack "H*")))
57
71
 
58
- (let* ((size (if (hash-table-exist? params "size")
59
- (to-i (car (to-list (hash-table-get params "size"))))
60
- default-size))
61
- (wording (if (hash-table-exist? params "w")
62
- (car (to-list (hash-table-get params "w")))
63
- default-wording))
64
- (fonttype (if (hash-table-exist? params "type")
65
- (to-i (car (to-list (hash-table-get params "type"))))
66
- default-fonttype)))
67
- (let* ((size (calc-limit 1 size (length size-list)))
68
- (fonttype (calc-limit 1 fonttype (length font-list))))
72
+
73
+ ;; ----------------------------------
74
+ ;; top page
75
+ ;; -----------------------------------
76
+ (define (top-page params)
77
+ (define (calc-limit _start val _end)
78
+ (min (max _start val) _end))
79
+ (define (get-param params key default-value)
80
+ (if (hash-table-exist? params key)
81
+ (car (to-list (hash-table-get params key)))
82
+ default-value))
83
+
84
+ (let ((size (to-i (get-param params "size" default-size)))
85
+ (wording (get-param params "w" #f))
86
+ (fonttype (to-i (get-param params "type" default-fonttype))))
87
+ (let ((size (calc-limit 1 size (length size-list)))
88
+ (fonttype (calc-limit 1 fonttype (length font-list))))
69
89
  `(
70
90
  ,(html-doctype)
71
91
  ,(html:head
@@ -73,50 +93,49 @@
73
93
  ,(html:body
74
94
  (html:div :style "text-align: center; "
75
95
  (html:h1 "デカ文字作成")
76
- (html:p
77
- "下記に文章を入れて『画像化』ボタンを押して下さい")
78
- (html:form
79
- :method "POST"
80
- :action "./dekamoji.cgi"
81
- (html:input :name "w" :type "text" :size 60 :value wording)
82
- (html:br)
83
- (map
84
- (lambda (x)
85
- (list
86
- (html:input :name "size" :type "radio"
87
- :value (car x)
88
- :CHECKED (eq? (car x) size))
89
- (cdr x)))
90
- size-list)
91
- (html:br)
92
- (map
93
- (lambda (x)
94
- (list
95
- (html:input :name "type" :type "radio"
96
- :value (car x)
97
- :CHECKED (eq? (to-i (car x)) fonttype))
98
- (second x)))
99
- font-list)
100
- (html:br)
101
- (html:input :type "submit" :value "画像化"))
96
+ (html:p "文章を入れて『画像化』ボタンを押して下さい")
97
+ (html:form :method "POST" :action "./dekamoji.cgi"
98
+ (html:input :name "w" :type "text" :size 60 :value wording)
99
+ (html:br)
100
+ (map (lambda (x) (list
101
+ (html:input :name "size" :type "radio" :value (car x)
102
+ :CHECKED (eq? (car x) size))
103
+ (cdr x)))
104
+ size-list)
105
+ (html:br)
106
+ (map (lambda (x) (list
107
+ (html:input :name "type" :type "radio" :value (car x)
108
+ :CHECKED (eq? (to-i (car x)) fonttype))
109
+ (second x)))
110
+ font-list)
111
+ (html:br)
112
+ (html:input :type "submit" :value "画像化"))
102
113
  (html:hr)
103
- (html:img :src (sprintf "./dekamoji.cgi?img=1&size=%d&type=%s&w=%s" size fonttype wording))
114
+ (cond
115
+ (wording
116
+ (html:img :src (sprintf "./dekamoji.cgi?img=1&size=%d&type=%s&w=%s" size fonttype (encode-wording wording))))
117
+ (else
118
+ (html:p "no image")))
104
119
  (html:hr)))))))
105
120
 
106
121
  (define fontsize-alist '(
107
- ("1" . 40)
108
- ("2" . 80)
109
- ("3" . 160)
110
- ("4" . 320)
122
+ ("1" . 20)
123
+ ("2" . 40)
124
+ ("3" . 80)
125
+ ("4" . 160)
126
+ ("5" . 320)
111
127
  ))
112
128
 
113
- (if #f
129
+ ;; -----------------------------------
130
+ ;; entry point
131
+ ;; -----------------------------------
132
+ (if #t
114
133
  ;; testing
115
134
  (display
116
135
  (response-dekamoji
117
136
  "デカ文字"
118
137
  80
119
- (+ fontbase "/IPAfont00302/ipam.ttf")))
138
+ (+ fontbase "ipamp.ttf")))
120
139
  ;; release
121
140
  (let1 cgi (CGI.new)
122
141
  (cond ((hash-table-exist? cgi.params "img")
data/example/fact.nnd CHANGED
@@ -8,8 +8,5 @@
8
8
  1
9
9
  (* n #?=(fact (- n 1)))))
10
10
 
11
- (print (fact 5))
12
-
13
-
14
-
15
-
11
+ (define (main argv)
12
+ (print (fact 5)))
@@ -18,6 +18,8 @@
18
18
  x))))
19
19
  (range max)))
20
20
 
21
- (for-each
22
- print
23
- (fizzbuzz 30))
21
+ (define (main argv)
22
+ (for-each
23
+ print
24
+ (fizzbuzz 30)))
25
+
@@ -0,0 +1,71 @@
1
+ #!/bin/sh
2
+ :; #-*- mode: nendo; syntax: scheme -*-;;
3
+ :; exec /usr/local/bin/nendo $0 $*
4
+ ;; -*- coding: utf-8 -*-
5
+ ;; Nqueen
6
+ ;; n×n の互いに効き線上にないクイーンの配列をみつける
7
+
8
+ ;; SHINYAMA Yusuke (euske@cl.cs.titech.ac.jp)
9
+ ;; This software is public domain.
10
+
11
+ (define (decr x) (- x 1))
12
+ (define (incr x) (+ x 1))
13
+
14
+ ; rotate: ベクタ x を pos要素 だけ回転させる
15
+ (define (rotate x pos)
16
+ (do ((last (decr (vector-length x)))
17
+ (x0 (vector-ref x pos))
18
+ (i pos (incr i)))
19
+ ((= i last) (vector-set! x last x0))
20
+ (vector-set! x i (vector-ref x (incr i)))))
21
+
22
+ ; rotrec: ベクタ x の要素の、あらゆる配置の組み合わせに func を適用する
23
+ (define (rotrec func x pos)
24
+ (let ((last (decr (vector-length x))))
25
+ (if (= pos last)
26
+ (func x)
27
+ (do ((i pos (incr i)))
28
+ ((< last i) #f)
29
+ (rotrec func x (incr pos))
30
+ (rotate x pos)))))
31
+
32
+ ; genpat: n×n の盤の初期パターンを作る
33
+ (define (genpat n)
34
+ (let ((x (make-vector n)))
35
+ (do ((i 0 (incr i)))
36
+ ((= n i) x)
37
+ (vector-set! x i i))))
38
+
39
+ ; checkqueen: パターン p がすべて互いに効き線上にないクイーンなら #t
40
+ (define (checkqueen p)
41
+ (define (loop i diag0 diag1) ; i はカウンタ, diag0, diag1 はリスト
42
+ (or (zero? i)
43
+ (let* ((x (decr i))
44
+ (y (vector-ref p x))
45
+ (d0 (+ x y))
46
+ (d1 (- x y)))
47
+ ;;(printf "check: %s (%d,%d) in %s,%s\n" p x y (write-to-string diag0) (write-to-string diag1))
48
+ (and (not (or (memv d0 diag0)
49
+ (memv d1 diag1)))
50
+ (loop (decr i) (cons d0 diag0) (cons d1 diag1))))))
51
+ (loop (vector-length p) '() '()))
52
+
53
+ ; nqueen: メインルーチン
54
+ (define (nqueen n)
55
+ (let ((result '()))
56
+ (rotrec (lambda (p)
57
+ (if (checkqueen p)
58
+ (set! result
59
+ (cons (vector->list p) result))))
60
+ (genpat n) 0)
61
+ result))
62
+
63
+ ; sample
64
+ ;(display (nqueen 8))(newline)(exit)
65
+
66
+ (define (main args)
67
+ (display (nqueen 8))
68
+ (newline)
69
+ (exit 0))
70
+ (main *argv*)
71
+
data/example/scratch.nnd CHANGED
@@ -1,7 +1,6 @@
1
1
  ;;-*- mode: nendo; syntax: scheme -*-;;
2
-
3
2
  ;; -----------------
4
3
  (enable-idebug)
4
+ (disable-idebug)
5
5
  (define debug-print-length 256)
6
6
 
7
-
data/lib/debug/syslog.nnd CHANGED
@@ -3,7 +3,7 @@
3
3
  ;;; debug/syslog.nnd - #?= debug message output to syslog
4
4
  ;;;
5
5
  ;;;
6
- ;;; Copyright (c) 2000-2010 Kiyoka Nishiyama <kiyoka@sumibi.org>
6
+ ;;; Copyright (c) 2009-2010 Kiyoka Nishiyama <kiyoka@sumibi.org>
7
7
  ;;;
8
8
  ;;; Redistribution and use in source and binary forms, with or without
9
9
  ;;; modification, are permitted provided that the following conditions
@@ -1,3 +1,7 @@
1
+ #
2
+ # This file is nendo's compiled library file.
3
+ # generated "nendo -c src" command.
4
+ #
1
5
 
2
6
  callProcedure( 'require',
3
7
  begin
@@ -51,3 +55,8 @@
51
55
  end
52
56
  }
53
57
  end
58
+
59
+
60
+ # -------------------------------------------------------
61
+ # [EOF]
62
+ # -------------------------------------------------------