2008/12/17

【Scheme】問題1.3@SICP【Lisp】

問題1.3
3つの数を引数に取りその中の大きいもの二つの平方の和を返す手続きを定義せよ。


:再帰でいってみよー
(define (square x)
  (* x x))

(define (sum-of-bigpair a b c)
  (if (and (< a b)(< a c))
    ;(+ (* b b)(* c c))
    (+ (square b)(square c))
    (sum-of-bigpair b c a)))

(sum-of-bigpair 1 2 3) ; => 13
(sum-of-bigpair 5 6 2) ; => 61
(sum-of-bigpair -1 -2 -3) ; => 5


絶対もっとスマートな解があるだろ。
でも、ここまでで出てきたのは関数定義と条件分岐だけだし・・・
あー、あとandとorか。(論理和、論理積)
馬鹿正直に書いたらif文で書くことになる^^;
(最初、まんまとif文で書いた)
解答を探してみたら、こんなページ発見。
いろんな考え方があるんだねー。考え方がわかりやすく書いてあっておもしろい><

こういう解答をSICPにも載せてくれりゃーいいのに。
SICP練習問題1.1~1.3
http://blog.ajiyoshi.org/Entry/275/


>全部足してから一番小さいのだけ引く
とか、なるほど。

【Scheme】【Lisp】携帯電話で使えるiアプリすぷ

こ、これは・・・!? 
10120688477

携帯電話で使える iアプリすぷ
http://www.yuasa.kuis.kyoto-u.ac.jp/~yuasa/jakld-i/jakld-jssst.pdf

*注、PDF直リンク


(TUT-)Scheme入門
http://www.yuasa.kuis.kyoto-u.ac.jp/~hiraisi/files/tus-lecture.pptx

*注、pptx直リンク
↑これに載ってた。


[追記]
ケータイで動く i アプリすぷ iαpplisp
http://jp.franz.com/base/seminar/2006-11-22/SeminarNov2006-yuasa.pdf

[追記2]
docomo携帯で下記URLからダウンロード可能!
http://ryujin.kuis.kyoto-u.ac.jp/~yuasa/jakld-i/

試しに、
(define h "hello")
h
ってして、evalってしたら・・・
Debug Windowに "hello"
すげーな!最近は携帯アプリでプログラミングっすか!?

【Scheme】SchemeでもCollatz


ということでSchemeでも今できる範囲で書いてみた。
きっとヒドイのだろうけど。。
(define (collatz n)
  (display n)
  (newline)
  (if (> n 1)
    (if (even? n)
      (collatz (/ n 2))
      (collatz (+ (* n 3) 1)))))
(collatz 5)
;=> 5
;=> 16
;=> 8
;=> 4
;=> 2
;=> 1

プログラミングGauche

2008/11/23

【JavaScript】インタラクティブなJavaScript実行【これは便利】

JavaScriptのシェル改良版
http://muumoo.jp/news/2008/06/21/0jssh.html

[javascript]InteractiveJS その2
http://d.hatena.ne.jp/nak2k/20050911/p1

【scheme】【javascript】Hello world その2

schemeでHello world!!
参考はこちら
http://www.shido.info/lisp/scheme4.html

(define hello
  (lambda (name) 
    (string-append "Hello " name "!")))
(hello "valvallow")

出力結果
"Hello valvallow!"

(cons "Hello world" '())


出力結果
("Hello world")

(define sum3
  (lambda (a b c)
    (+ a b c)))
(sum3 1 2 3)


出力結果
6


最後の関数はJavaScriptで書くとこんな感じ?
あえてグローバル空間汚すと
sum3 = function (a, b, c) { return a+b+c; };
sum3(1, 2, 3)
//出力結果 6


定義してそのまま実行して、グローバル空間汚さないんだったら
(function () { return function (a,b,c) { return a+b+c; }; })()(1,2,3)
//出力結果 6


ってか。

【scheme】Hello world

schemeでHello world!!


参考はこちら
http://www.shido.info/lisp/scheme4.html


schemeは関数型言語
最近流行(?)のHaskellは純粋関数型言語らしいが、schemeはどうやら非純粋関数型言語らしい。

(define hello "Hello world") 
(define sayHello
    (lambda () hello)) 

hello
(sayHello)


実行結果
"Hello world"
"Hello world"


正直まだコメントの書き方も、変数や関数の名前付けの傾向もわかりませんw


(define hello "Hello world") ⇒ defineは引数を2つ取る組み込み関数
(define sayHello ⇒ 1つ目の引数がグローバル変数の名前
(lambda () hello)) ⇒ 2つ目の引数が変数の中身
⇒ ここでは1行目で定義したhelloグローバル変数の中身を出力するようにした
hello ⇒ 1行目で定義した変数の中身が出力される
(sayHello) ⇒ 2行目で定義した関数が実行された結果が出力される


関数型言語は、「さんしょうとうかせい」と「ふくさようがない」ということで、バグの少ない良いプログラムを書くことができるらしい。
C#のラムダはこういった関数型言語から影響を受けたらしい。
Rubyは、「MatzLisp」とか「Algolの仮面をかぶったLisp」とか呼ばれてるらしいね。
らしいばかりでスマソ。

【scheme】【JavaScript】関数定義(可変長引数)(C#でいうparams)

schemeでも関数の定義。
可変長引数について。

C#のparamsキーワード付き引数的な、JavaScriptのargumentsプロパティ的な。

そうそう、コメントの仕方もわかった♪
「;」で始まる行はコメントになるっぽい。

参考はこちら
http://www.shido.info/lisp/scheme4.html
(define three-args+
  (lambda (a b c . d)
    (list a b c d)))

(three-args+ 1 2 3)
;; => (1 2 3 ())

(three-args+ 1 2 3 4 5 6 7 8 9 10)
;; => (1 2 3 (4 5 6 7 8 9 10))

(define params+
  (lambda (a . p)
    (list a p)))

(params+ 1 2 4 5)
;; => (1 (2 4 5))

でも、引数が0個もしくは1個もしくは複数個とかできんのかなぁー。
JavaScriptだとこんな感じか?

(function () { return function () { return arguments; }; })()(1,2,3,4,5,6,7)
それとも?
(function () { return function () { var ret = []; for (var i = 0; i < arguments.length; i++)ret.push(arguments[i]); return ret; }; })()(1,2,3,4,5,6,7)

The Little Schemer, 4th Edition

2008/11/22

【scheme】Scheme(Lisp)はじめました。

Lispの方言(らしい)schemeをはじめました。
括弧だらけでおもしろいですw
ハッカーと画家」の影響です。


今度、参考書として「計算機プログラムの構造と解釈」でも買おうと思う。
訳が酷すぎるという噂なので、一応立ち読んでから決める。


開発環境は「DrScheme」というIDE(?)です。
ステップ実行でデバッグでっきます。
また、日本語にも対応しています。


詳しくは以下を参照
・インストール
もうひとつの Scheme 入門
http://www.shido.info/lisp/idx_scm.html


・日本語化
scm-startup
http://www.math.kyoto-u.ac.jp/~susumu/lecture/kjsen07/ex/scm-startup/index.html


↓ちなみにこんな感じ。↓
(cons "Sum of" (cons (cons 1 (cons 2 (cons 3 (cons 4 '())))) (cons "is" (cons 10 '()))))
出力結果 ⇒ ("Sum of" (1 2 3 4) "is" 10)


そういや、こないだRubyもはじめたところですw
「初めてのRuby」読みながら♪
この本は噂どおり良書っぽいです。
毎日昼休みにやってます♪