Skip to content

Instantly share code, notes, and snippets.

@mnogu
Created August 28, 2011 02:15
Show Gist options
  • Select an option

  • Save mnogu/1176154 to your computer and use it in GitHub Desktop.

Select an option

Save mnogu/1176154 to your computer and use it in GitHub Desktop.
(define custom-table?
(lambda (table-repls)
(and (list? table-repls)
(every (lambda (row)
(and (list? row)
(every (lambda (cell)
(string? cell))
row)))
table-repls))))
(define custom-list-as-table
(lambda (tbl)
(string-append "'("
(string-join
(map (lambda (lst)
(string-append "("
(string-join
(map (lambda (elem)
(string-escape elem)) lst) " ") ")")) tbl) " ") ")")))
(require-extension (srfi 1))
(require "japanese.scm")
(define ja-rk-rule-rule->table (lambda (rule)
(map
(lambda (item)
; ((("k" "a")) ("か" "カ" "カ")) -> ("ka" "" "か")
; ((("k" "k") "k") ("っ" "ッ" "ッ")) -> ("kk" "k" "っ")
; ((("k" "y" "a")) (("き" "キ" "キ") ("ゃ" "ャ" "ャ"))) -> ("kya" "" "きゃ")
(list
; ((("k" "a")) ("か" "カ" "カ")) -> "ka"
(fold-right string-append ""
(caar item))
(let ((next-input (cdar item)))
(or
(and
; ((("k" "a")) ("か" "カ" "カ")) -> ""
(null? next-input) "")
; ((("k" "k") "k") ("っ" "ッ" "ッ")) -> "k"
(car next-input)))
(let*
((output (cadr item))
(single-output (car output)))
(or
(and
; ((("k" "a")) ("か" "カ" "カ")) -> "か"
(string? single-output) single-output)
; ((("k" "y" "a")) (("き" "キ" "キ") ("ゃ" "ャ" "ャ"))) -> "きゃ"
(fold-right string-append ""
(string-to-list
(ja-make-kana-str output ja-type-hiragana))))))) rule)))
(define ja-rk-rule-table->rule (lambda (table)
(map
(lambda (item)
; ("ka" "" "か") -> ((("k" "a")) ("か" "カ" "カ"))
; ("kk" "k" "っ") -> ((("k" "k") "k") ("っ" "ッ" "ッ"))
; ("kya" "" "きゃ") -> ((("k" "y" "a")) (("き" "キ" "キ") ("ゃ" "ャ" "ャ")))
(list
(cons
(let ((input (car item)))
(or
(and
(string=? input "yen")
; ("yen" "" "¥") -> ("yen")
'("yen"))
; ("ka" "" "か") -> ("k" "a")
(reverse
(string-to-list input))))
(let ((next-input (cadr item)))
(or
(and
; ("ka" "" "か") -> none
(string=? next-input "") '())
; ("kk" "k" "っ") -> "k"
(cons next-input '()))))
(let ((output (caddr item)))
(or
(and
(=
(length
(string-to-list output)) 1)
; ("ka" "" "か") -> ("か" "カ" "カ")
(ja-find-kana-list-from-rule ja-rk-rule output))
; ("kya" "" "きゃ") -> (("き" "キ" "キ") ("ゃ" "ャ" "ャ"))
(map
(lambda (char)
(ja-find-kana-list-from-rule ja-rk-rule char))
(reverse
(string-to-list output))))))) table)))
(define-custom 'ja-rk-rule-table (ja-rk-rule-rule->table ja-rk-rule)
'(ja-rk-rule)
'(table (N_ "Input") (N_ "Next Input") (N_ "Output"))
(N_ "Japanese Romaji-Kana rule")
(N_ "long description will be here."))
(custom-add-hook 'ja-rk-rule-table
'custom-set-hooks
(lambda ()
(set! ja-rk-rule
(ja-rk-rule-table->rule ja-rk-rule-table))
(ja-rk-rule-update)))
("test custom-table?"
(assert-true (uim-bool '(custom-table?
'())))
(assert-true (uim-bool '(custom-table?
'(("")))))
(assert-true (uim-bool '(custom-table?
'(("Alice")))))
(assert-true (uim-bool '(custom-table?
'(("Alice" "Bob")))))
(assert-true (uim-bool '(custom-table?
'(("Alice" "Bob") ("Carol" "Dave")))))
(assert-true (uim-bool '(custom-table?
'(("Alice" "Bob") ("Carol" "Dave" "Eve")))))
(assert-false (uim-bool '(custom-table?
#t)))
(assert-false (uim-bool '(custom-table?
"Alice")))
(assert-false (uim-bool '(custom-table?
'Alice)))
(assert-false (uim-bool '(custom-table?
1)))
(assert-false (uim-bool '(custom-table?
'(("Alice" "Bob") #t))))
(assert-false (uim-bool '(custom-table?
'(("Alice" "Bob") "Carol"))))
(assert-false (uim-bool '(custom-table?
'(("Alice" "Bob") 'Carol))))
(assert-false (uim-bool '(custom-table?
'(("Alice" "Bob") 1))))
(assert-false (uim-bool '(custom-table?
'(("Alice" "Bob") ("Carol" "Dave" #t)))))
(assert-false (uim-bool '(custom-table?
'(("Alice" "Bob") ("Carol" "Dave" 'Eve)))))
(assert-false (uim-bool '(custom-table?
'(("Alice" "Bob") ("Carol" "Dave" 1))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment