月曜日, 10月 29, 2012

Object-C 文字列;Makefile

Object-Cでは文字列はNSStringなどを使うことができます。

文字列へのポインタとして扱うことができます。

メンバ関数 UTF8String を使うと、char*として扱うことができます。


#import <stdio.h>
#import <foundation/foundation.h> 
#import <Foundation/NSObject.h>

@interface Verb:NSObject
-(void)print: (NSString*)stem;
@end

@implementation Verb
-(void)print: (NSString*)stem
{
  char* str=[stem UTF8String];
  printf("%sim\n",str);
  printf("%sis\n",str);
  printf("%si\n",str);
  printf("%sime\n",str);
  printf("%site\n",str);
  printf("%si\n",str);
}
@end

int main()
{
  NSString *stem=@"rozumim";
  id obj=[Verb alloc];
  [obj print:stem];
  return 0;
}

GNUmakefile ファイルにおいて、以下のようにコンパイルの条件を指定すると、make 一発でコンパイルできます。

GNUSTEP_MAKEFILES=c:/GNUstep/GNUstep/System/Library/Makefiles
include $(GNUSTEP_MAKEFILES)/common.make

TOOL_NAME = verb
verb_OBJC_FILES = verb.m

include $(GNUSTEP_MAKEFILES)/tool.make


土曜日, 10月 27, 2012

Objective-Cのプロトコルとは

Objective-C では、クラス継承の際に必須のメソッドを規定するプロトコルという概念があります。

まさしく、Java でいうところのインターフェースの概念と同じもので、メンバ関数を持たないクラスとして実装されます。プロトコルで指定されるメソッドは宣言のみで、抽象クラスとして実装されます。

#import >stdio .h=".h">
#import >foundation bject.h="bject.h">

@protocol ToString
-(void)toString;
@end

@interface Test:NSObject>tostring>
@end

@implementation Test
-(void)toString
{ 
  printf("This is class Test.\n");
}
@end

int main()
{
  id obj=[Test alloc];
  [obj toString];
  return 0;
}



火曜日, 10月 23, 2012

Objective-C のクラスメソッド

Objective-Cにも静的なメソッドというものがあります。

Objective-Cの用語ではクラスメソッドというものです。

Javaでいうところのstaticにあたります。

当然ながら、メンバ変数を持つことはありません。

メソッドの宣言に+(プラス記号)をつけます。

#import <stdio.h>
#import <Foundation/NSObject.h>

@interface Test:NSObject
{
  int index;
}
- (void) hello;
- (void) setIndex:(int) i;
+ (void) dump;
@end

@implementation Test
- (void) setIndex:(int) i
{
  self->index=i;
}
-(void)hello
{
  printf("Hello NSObject %d\n",self->index);
}
+(void)dump
{
  printf("Class method = static");
}
@end

int main()
{
  [Test dump];
  return 0;
} 

他にも@propertyや@synthesizeなどいうキーワードがありますが、GNUstepはサポートしていません。

参照先がreleaseされたときの挙動を変えるものです。
@property(nonatomic, assign)
@property(nonatomic, retain)

月曜日, 10月 22, 2012

OOP, any problems?

Do not compare apples and oranges.

OOP is implemented as an extension of C.  But it is a completely different concept. 

What is good about OOP is the change of the design framework of programming.  Say, Lisp can be converted to C and that indeed is what the compiler does.  But they are different languages with more focuses on its abstraction.  Likewise, OOP is a way of abstraction, a way to express it.

Writing in Lisp is different from writing in C.  They are not interchangeable.  It may be the same to the machine but not to programmers.

Not even knowing the importance of its concepts and talking about issues of implementation, is somewhat like looking at trees and not seeing the woods.

It is just a way to devalue OOP. 

The reason why they are to denigrate the importance of the revolution, is totally of theirs, not ours.

In the year 2012, why should we need to emphasize the importance of OOP for Pete's sake?

Please.  Let us have the freedom of thoughts and religions.

日曜日, 10月 21, 2012

Object-Cのクラスについて

それでは試行錯誤でどうやら動くようになったGNUstepの話の続きを。

Object-CはC++に似て、クラスの定義にヘッダーを必要とします。

変数・関数の宣言に順番を気にしなければならなかったCの名残りといえるでしょう。

定義と実装は別々に行います。

Javaの場合には、そんなものは必要がなく、publicクラスにそれぞれ独自のファイルを用意してクラスの実装のみを記述します。

#importでクラスを指定さえすれば、順番も関係なく使用することができます。

Object-Cのクラス宣言と実装、呼び出しの方法を下記に示します。

#import <stdio.h>
#import <Foundation/NSObject.h>

@interface Test:NSObject
-(void) hello;
@end

@implementation Test
-(void)hello
{
  printf("Hello NSObject\n");
}
@end

int main()
{
  id obj=[Test alloc];
  [obj hello];
  return 0;
}

コンパイラオプションはこちらを使いました。
gcc nsclass.m -I c:/GNUstep/GNUstep/System/Library/Headers -L c:/GNUstep/GNUstep/System/Library/Libraries -lobjc -lgnustep-base 


Objective-Cは引数の指定の仕方が独特です。

型をいちいち指定して呼び出します。

Javaのように引数とメンバ変数を同名にすると警告が出ます。

#import <stdio.h>
#import <Foundation/NSObject.h>

@interface Test:NSObject
{
  int index;
}
- (void) hello;
- (void) setIndex:(int) i;
@end

@implementation Test
- (void) setIndex:(int) i
{
  self->index=i;
}
-(void)hello
{
  printf("Hello NSObject %d\n",self->index);
}
@end

int main()
{
  id obj=[Test alloc];
  [obj setIndex:10];
  [obj hello];
  return 0;
}

土曜日, 10月 20, 2012

Windows で GNUstep を使った Object-C プログラミング

iPad が隆盛を極めてはや数年、マイクロソフトもついに(高額)タブレットPCを発売。

キーボードに凝りまくったというCMがネットで流れています。26日にはARMベースのマシンが発売されます。

最安モデルで499ドル。まさにアップル並みの値段。

競合モデルとしては、もっさりと遅いでも安いAndroidマシンか、アップルの小型iPadマシンか。

1月には Windows 8 ベースのマシンが発売されます。

Windowsベースのアプリが動くとなれば、これは革命です。


開発者として、傲慢なアップルの「開発しにくくしてカネをとろうとする」態度は正直なところ好きになれません。

頭(か性格か)の悪すぎるやりかただと思います。

と正直な感想から、Object-Cのはなし。

WindowsでもGNUstepというプロジェクトがあって、Object-Cでプログラムが書けます。

こちらを参照しました。

OOP言語であるObject-Cですが、C#よりJavaに遠い。

PC販売に影響したというタブレット市場がどのように変化していくのか、新製品を横目にプログラムにいそしむ週末になりそうです。

金曜日, 10月 05, 2012

Elispで文字列置換

久しぶりに elisp でプログラム。

オープンソースの始祖であるところのGNUの鉄則に従って、書いた分だけここに置いておきます。

文字列変換というごくごくシンプルなものですが、変換後にバッファでのポイントの位置がずれることに注意。

(defun replace-tags-region (from-string to-string begin end)
"Replaces from-string to to-string in the region from begin to end."
  (let ((len (- (length to-string)(length from-string))))
    (goto-char begin)
    (while (search-forward from-string end t)
      (replace-match to-string t)
      (setq end (+ end len)))))

(defun replace-tags-list (tag-list)
"Takes a list of (from-string to-string) and replaces all from-string to to-string in the buffer."
  (replace-tags-region (car tag-list) (cadr tag-list)(point-min)(point-max))) 

  

;; Usage:
;; (setq tag-list '(("TABLE" "table")("TD" "td")("TR" "tr")))
;; (replace-tags tag-list)

(defun replace-tags (tag-list)
"Takes a list of lists of (from-string to-string) and replaces all from-string to to-string in the buffer."
  (mapcar 'replace-tags-list tag-list))

(defun create-end-tag (tag-name)
  "Creates closing tag from the given tag-name."
  (concat "</" tag-name ">"))

(defun create-half-begin-tag (tag-name)
  "Creates opening tag from the given tag-name."
  (concat "<" tag-name " "))

(defun create-attribute-tag (tag-name)
  "Creates attribute string from the given tag-name."
  (concat " " tag-name "=\""))

(defun create-begin-tag (tag-name)
  "Creates opening tag from the given tag-name."
  (concat "<" tag-name ">"))

 

;; Usage:
;;(setq tag-list '("TABLE" "TD" "B" "BR" "A" "HTML" "NOSCRIPT" "SCRIPT" "HEAD" "BODY" "TR" "TITLE" "I"))
;;(mapcar (lambda (x)(create-replacement-list 'create-end-tag x)) tag-list)
(defun create-replacement-list (create-list tag-name)
"Creates a list of tag name and lowercase tag name lists."
  (cons (funcall create-list tag-name) (list (funcall create-list (downcase tag-name)))))

(defun lowercase-html-tags()
"Converts uppercase HTML tag names to lowercase."
  (interactive)
  (let* ((tag-list '("TABLE" "TD" "B" "BR" "A" "HTML" "NOSCRIPT" "SCRIPT" "HEAD" "BODY" "TR" "TITLE" "I"))
  (attribute-list '("VALIGN" "ALIGN" "WIDTH" "HEIGHT" "BOTTOM" "CLASS" "BGCOLOR" "BORDER" "LEFT" "RIGHT" "TOP" "CELLPADDING" "CELLSPACING" "BORDERCOLOR" "CENTER" "MIDDLE" "HREF" "COLSPAN" "ROWSPAN" "SRC" "onMouseOver" "onMouseOut" "ALT" "NAME" "ID" "VSPACE" "LINK" "META" "LEFTMARGIN" "TOPMARGIN" "MARGINWIDTH" "MARGINHEIGHT" "onLoad" "BACKGROUND" "TYPE" "HTTP-EQUIV" "CONTENT" "REL" "LANGUAGE"))
  (half-tag-list '("TABLE" "TD" "A" "IMG" "LINK" "META" "SCRIPT" "BODY" "TR" "DIV"))
  (replacement-end-tags (mapcar (lambda (x)(create-replacement-list 'create-end-tag x)) tag-list))
  (replacement-begin-tags (mapcar (lambda (x)(create-replacement-list 'create-begin-tag x)) tag-list))
  (replacement-half-begin-tags (mapcar (lambda (x)(create-replacement-list 'create-half-begin-tag x)) half-tag-list))
  (replacement-attribute-tags (mapcar (lambda (x)(create-replacement-list 'create-attribute-tag x)) attribute-list)))
    (replace-tags replacement-attribute-tags)
    (replace-tags replacement-end-tags)
    (replace-tags replacement-half-begin-tags)
    (replace-tags replacement-begin-tags)))

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...