整数で値をひとつ読み込み、それを半径とする円の面積を求めて表示するプログラムを作成しなさい。 円周率は3.14とし、計算結果は、小数第2位を四捨五入して小数第一位まで表示すること。
知恵袋方面に上記のプログラムをPHPで書きたい人がいるという噂を聞きました。世の中にはPHPの宿題が出る学校があったりするのかもしれません。PHPなら任せろー、というわけでPHPのLua拡張を利用して書いてみましょう。LuaもLua拡張も初心者ですが、がんばります!
まず手元のPHPのバージョンを確認します。今回はPHP 7.0.4を使います。
$ php -v
PHP 7.0.4 (cli) (built: Mar 9 2016 16:14:46) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
with Xdebug v2.4.0, Copyright (c) 2002-2016, by Derick Rethans
手元のマシンはMacなのでLuaをHomebrewでインストール。
$ brew install lua
Lua拡張は2.0.0からPHP 7に対応しているので、これをダウンロード&ビルドします。
$ wget https://pecl.php.net/get/lua-2.0.0.tgz
$ tar xvzf lua-2.0.0.tgz
$ cd lua-2.0.0
$ phpize
$ ./configure --with-lua=$(brew --prefix lua)
$ make
$ make install
インストールできました。
$ php -dextension=lua.so -i |grep -C2 -i '^lua'
libXML streams => enabled
lua
--
lua support => enabled
lua extension version => 2.0.0
lua release => Lua 5.2.4
lua copyright => Lua 5.2.4 Copyright (C) 1994-2015 Lua.org, PUC-Rio
lua authors => R. Ierusalimschy, L. H. de Figueiredo, W. Celes
mbstring
どうやら動きそうです。さっそく問題を解いてみましょう。
lua.php
<?php
if ($_SERVER['argc'] === 1) die();
$l = new lua();
$l->assign('input', $_SERVER['argv'][1]);
$l->eval(<<<'CODE'
function round (x)
return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5)
end
pi_x100=314
area_of_circle=round(pi_x100*input*input/10)/10
print(string.format("%.1f\n", area_of_circle))
CODE
);
PHP(とLua)のプロの人ならスラスラ書けるのかもしれませんが、初心者なので割と時間がかかりました。では動かしてみましょう。
$ php -dextension=lua.so ./lua.php 1
3.1
$ php -dextension=lua.so ./lua.php 2
12.6
$ php -dextension=lua.so ./lua.php 3
28.3
$ php -dextension=lua.so ./lua.php 4
50.2
やった!初心者だけど出来ちゃった!