Hatena::Groupbluespear

bluespearの勉強メモ

2008-07-24

[]作業ログ - 自動で改行を反映 オプション 02:02

Editに,改行をチルダに置換するオプションを付ける.

ベースPukiWiki 1.4.7plus-u2-eucjp

参考: 改行を有効にする-PukiWikiの雑記/改行を有効にする-Wiki 自由帳 - XOOPSマニア

追加

*** ja.lng.dist.php.orig	Mon Apr 24 16:43:07 2006
--- ja.lng.dist.php	Fri Jul 25 01:35:34 2008
***************
*** 70,75 ****
--- 70,76 ----
  $_btn_update    = 'ページの更新';
  $_btn_cancel    = 'キャンセル';
  $_btn_notchangetimestamp = 'タイムスタンプを変更しない';
+ $_btn_enter_enable = '自動で改行を反映させる';
  $_btn_addtop    = 'ページの上に追加';
  $_btn_template  = '雛形とするページ';
  $_btn_load      = '読込';
*** ja.lng.php.orig	Thu May 25 01:40:04 2006
--- ja.lng.php	Fri Jul 25 01:35:29 2008
***************
*** 70,75 ****
--- 70,76 ----
  $_btn_update    = 'ページの更新';
  $_btn_cancel    = 'キャンセル';
  $_btn_notchangetimestamp = 'タイムスタンプを変更しない';
+ $_btn_enter_enable = '自動で改行を反映させる';
  $_btn_addtop    = 'ページの上に追加';
  $_btn_template  = '雛形とするページ';
  $_btn_load      = '読込';
  • plugin/edit.inc.php
*** edit.inc.php.orig	Wed Jun 14 13:39:46 2006
--- edit.inc.php	Fri Jul 25 02:00:41 2008
***************
*** 151,156 ****
--- 151,174 ----
  
  	// Delete "#freeze" command
  	$vars['msg'] = preg_replace('/^#freeze\s*$/im', '', $vars['msg']);
+ 
+ 	//改行からチルダへの置換オプション (original by nao-pon, edit by bluespear)
+ 	//改行コード統一
+ 	$vars['msg'] = preg_replace("/\x0D\x0A|\x0D|\x0A/","\n",$vars['msg']);
+ 	//改行有効
+ 	if(isset($vars["enter_enable"])) {
+ 		//改行前の~を削除
+ 		$vars['msg'] = preg_replace("/~\n/","\n",$vars['msg']);
+ 		//行の配列に変換して1行毎に処理
+ 		$post_lines = array();
+ 		$post_lines = split("\n",$vars['msg']);
+ 		$post_lines = preg_replace("/(^[^ #\-+*|].*)/","\\1~",$post_lines);
+ 		$vars['msg'] = join("\n",$post_lines);
+ 		//余分な~を削除
+ 		$vars['msg'] = preg_replace("/~\n([ #\-+*|\n])/","\n\\1",$vars['msg']);
+ 		$vars['msg'] = preg_replace("/~$/","",$vars['msg']);
+ 	}
+ 
  	$msg = & $vars['msg']; // Reference
  
  	$retvars = array();
*** html.php.orig	Mon Oct 16 11:45:15 2006
--- html.php	Fri Jul 25 01:58:38 2008
***************
*** 258,263 ****
--- 258,272 ----
  	$refpage = htmlspecialchars($vars['refpage']);
  	$add_assistant = edit_form_assistant();
  
+ 	// 自動で改行を反映(改行をチルダにする)チェックボックス
+ 	global $_btn_enter_enable;
+ 	$checked_enter = isset($vars['enter_enable']) ? ' checked="checked"' : '';
+ 	$add_enter_enable = '<input type="checkbox" name="enter_enable" ' .
+ 			'id="_edit_form_enterenable" value="true"' . $checked_enter . ' />' . "\n" .
+ 			'   ' . '<label for="_edit_form_enterenable"><span class="small">' .
+ 			$_btn_enter_enable . '</span></label>' . "\n" .
+ 			'&nbsp;';
+ 
  	// 'margin-bottom', 'float:left', and 'margin-top'
  	// are for layout of 'cancel button'
  	$body = <<<EOD
***************
*** 279,284 ****
--- 288,294 ----
     <input type="submit" name="write"   value="$_btn_update" accesskey="s" />
     $add_top
     $add_notimestamp
+    $add_enter_enable
    </div>
    <textarea name="original" rows="1" cols="1" style="display:none">$s_original</textarea>
    </div>

2008-06-18

[]SWI-Prologの基本的な使い方 10:23

SWI-Prolog限定なのかProlog仕様なのかわからないけど。後で調べる。

カレントディレクトリの変更, 確認

?- chdir('z\\prolog').

Yes
?- pwd.
z:\prolog

Yes

\は2重にしないとだめみたい。

ソースファイルの読み込み

?- ['source.pl'].

読み込まれた述語の表示

?- listing.

last([A], A).
last([A|B], C) :-
        last(B, C).


lastigai([A], []).
lastigai([A|B], [A|C]) :-
        lastigai(B, C).

[]基本的な文法 10:23

独特すぎて1週間ですっかり忘れてたのでメモ。よくわからずに書いてるので間違いが含まれてる可能性大。

Prologとは

論理言語であり、論理式で定義を行う。

関数定義

こんな感じ。

kei([],0).
kei([A|L], S) :- kei(L, SL),
                 S is A + SL.

頭部と体部をつなげる :- は、:=ではないので注意。これで15分悩んだ:p




変数

変数大文字から始まる。パターンマッチングに使う。

Prolog変数C言語でいうポインタの扱いらしい。要するにリファレンス

演算結果を変数にセットする is
?- X is 1 + 2.
X = 3

Yes

パターンマッチング = とは違う。

[]isと=の違い 10:23

isは計算しろ、という命令。

=は等しいということを示す。

f([], []).
f([X|L], [FX|FL]) :- FX is X*X,
                      f(L, FL).

?- f([3,4,5], X).
X = [9, 16, 25] 
f([], []).
f([X|L], [FX|FL]) :- FX = X*X,
                      f(L, FL).

?- f([3,4,5], X).
X = [3*3, 4*4, 5*5] 

ちなみに直接関数の中に計算式を入れるのと=は同じ。

f([], []).
f([X|L], [X*X|FL]) :- f(L, FL).

?- f([3,4,5], X).
X = [3*3, 4*4, 5*5] 

[]if then elseのようなことをする ! カットオペレータ 10:23

! (カットオペレータ)を用いる。

ここまで成立すると下の行にいかない。

abs(A, A) :- A > 0, !.
abs(A, MA) :- MA is -A.

max(X,Y,X) :- X>Y, !.
max(X,Y,Y).

2008-05-19

[]リストパターン 10:21

ワイルドカード "_"

いきなりリスト関係ないけど、いかなるパターンとも照合するワイルドカード _ 。パターンマッチには使いたいけど、バインドする必要はないときに使う。

リストパターン

リストは"頭とそれ以外"で表現できる。

(x:xs)
(x:[]) = [x]
[] --空リストに照合

":"はリスト構成の固有な構成法である。固有の構成子をコンスというらしい。++は固有ではないのでコンスじゃない。


教科書問題

7.1

addOne :: [Int] -> Int
addOne [] = 0
addOne (x:_) = x + 1

7.2

addTwo :: [Int] -> Int
addTwo [] = 0
addTwo (x:[]) = x
addTwo (x1:x2:_) = x1 + x2

7.3

addOne :: [Int] -> Int
addOne xs
  | xs == [] = 0
  | otherwise = head xs + 1

addTwo :: [Int] -> Int
addTwo xs
  | xs == [] = 0
  | length xs == 1 = head xs
  | otherwise = head xs + head(tail xs)

原始再起定義

基本的に

f [] = ...
f (x:xs) = ... fm xs

という形で定義される。

パタンにおける変数繰り返しの禁止
elem :: Int -> [Int] -> Bool
elem x (x:ys) = True
elem x (y:ys) = elem ys

ERROR file:.\test.hs:2 - Repeated variable "x" in pattern

教科書問題

7.6

elemNum :: Int -> [Int] -> Int
elemNum [] = 0
elemNum x (y:ys)
  | x == y = 1 + elemNum x ys
  | otherwise =  elemNum x ys

7.8

unzip :: [(a,b)] -> ([a],[b])
unzip [] = ([],[])
unzip ((a,b):xs) = (a:as, b:bs)
  where (as,bs) = unzip xs

2008-05-12

[]タプル 10:22

2つ以上の値をまとめたもの。要素は別々の型でも良い。1要素タプルは存在しない。タプルの各要素は定義通りの順番でないといけない。

(123, "OneTwoThree")   :: (Int, String)
("String", [1,2,3,4])  :: ([Char], [Int])

0要素のタプルをユニットという。() :: ()

関数

fst, snd
2要素タプルの第一、第二要素を返す
zip
ふたつのリストから2要素タプルを生成。文字通りZipする。
unzip
zipの逆。2要素タプルのリストから(第一要素のリスト,第二要素のリスト)となるタプルを返す。

参考リンク

[]リスト 10:22

特定の型を任意個並べたもの。

[]          :: []
[1, 2, 3]   :: [Int]
"abc"       :: [Char] 
['a', 'b', 'c'] :: String
--関数のリスト
[fac,fastFib] :: [Int -> Int]

":"演算子リストの先頭とそれ以外に分けられる。

[1,2,3]
1:[2,3]
1:2:[3]
1:2:3:[]

数列表現

[1..5]みたいにかける。[1,3..]のようにすると無限リストになる。

リスト内包表記

数学の表現とにている。値がBoolとなる検査式も含めることができる。

Main> [(x,y) | x <- [1..5], y <- [6..10], x+y > 10]
[(1,10),(2,9),(2,10),(3,8),(3,9),(3,10),(4,7),(4,8),(4,9),(4,10),(5,6),(5,7),(5,8),(5,9),(5,10)]
参考リンク

2008-04-21

[]講義2回目 メモ 10:23

教室飽和これはひどい

前の行の空白以外の最初の左端寄りのトークンより左端寄りにあるトークンが新たな宣言の開始として解釈される。

ガード

foo :: Int -> Int -> Int
foo x y
  | x > y = x
  | otherwise = y

関数定義で使う。上から評価して、初めにTrueになる定義が使われる。| と =の間にあるのがガード。

otherwisePreludeモジュールで定義されている

otherwise = true

だそうな。

参考