2017年4月3日月曜日

開発環境

Think Perl 6: How to Think Like a Computer Scientist (Laurent Rosenfeld(著)、Allen B. Downey(著)、Oreilly & Associates Inc)のPart 1(Starting with the basics)、Chapter 5(Fruitful subroutines)の Exercise 5-3.を Scheme で取り組んでみる。

Exercise 5-3.

コード(Emacs)

(begin
  (define (first-l word) (if (string=? word "")
                            #false
                            (string-ref word 0)))
  (define (last-l word) (if (string=? word "")
                            #false
                            (string-ref word (- (string-length word) 1))))
  (define (middle-l word) (if (<= (string-length word) 1)
                              #false
                              (string-copy word 1 (- (string-length word) 1))))
  
  (define (p obj) (display obj) (newline))
  
  (p "1.")
  (p (middle-l "ab"))
  (p (middle-l ""))
  (p (middle-l "\""))

  (p "2.")
  (define (is-palindrome word)
    (if (<= (string-length word) 1)
        #true
        (and (char=? (first-l word) (last-l word))
             (is-palindrome (middle-l word)))))

  (define (p2 word bln1 bln2)
    (display word)
    (display " ")
    (display bln1)
    (display " ")
    (display bln2)
    (newline))
  (for-each (lambda (obj)
              (p2 (car obj) (is-palindrome (car obj)) (cdr obj)))
            (list (cons "" #t)
                  (cons "a" #t)
                  (cons "aa" #t)
                  (cons "ab" #f)
                  (cons "abc" #f)
                  (cons "aba" #t)
                  (cons "abcdedcba" #t)
                  (cons "abcdeedcba" #t)))
  'done
  )

入出力結果(Terminal, REPL)

$ ./ksi < palindrome.scm
> 1.

#false
#false
2.
 #true #true
a #true #true
aa #true #true
ab #false #false
abc #false #false
aba #true #true
abcdedcba #true #true
abcdeedcba #true #true
=> done
> $

0 コメント:

コメントを投稿