OCJP Silver 試験のお勉強

"Oracle Certified Java Programmer, Silver SE 8" という資格の勉強をしてるけど、Java の言語仕様がごちゃごちゃしていて悶絶している。

以下、個人的に疑問符がついたところ 2 つ。

可変長引数の書き方

メソッドの定義でコンパイルエラーとなるのは次のうちどれか、という問題。

  1. void foo(int[] args) { }
  2. void foo(int args[]) { }
  3. void foo(int... args) { }
  4. void foo(int args...) { }

答えはd の foo(int args...) { } なんだけど、b がコンパイルできて d がコンパイルエラーなのは自然じゃないなという感想。 まあ、b は C/C++ の名残で許容されているだけなので、そういう背景を知ったうえで、広い心で Java の言語仕様を受け入れようと思う。

関数式の引数

次のようなプログラムをコンパイルしたらどうなるかという問題。

import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        int n;

        Function<Integer, Integer>
            succ = n -> n + 1;  // コンパイルエラー
        System.out.println(succ.apply(0));
    }
}

このプログラムはコンパイルできない。 関数式の引数は、まわりのスコープのローカル変数とダブってはいけないということなので。 コンパイラは、"Lambda expression's parameter n cannot redeclare another local variable defined in an enclosing scope." というエラーを吐く。

Java の関数式まわりの仕様は、プログラムを組むときに気をつけなければならないことが結構多い。

Haskell Advent Calendar に投稿した

今年は Haskell Advent Calendar 2017 (その1) に投稿してみた。

次の論文で提案された、スーパーモナドという概念を解説するという内容。

  • J. Bracker and H. Nilsson. Supermonads: one notion to bind them all. In Proceedings of the 9th International Symposium on Haskell, pages 258-269, 2016.

用語の日本語訳は適当に充ててみたけど、自然な訳になってるか一抹の不安が。

一応、指標付きモナド"What I Wish I Knew When Learning Haskell" の日本語訳 から。 他は本当に適当。

スーパーモナドは "超モナド" と訳したほうが面白かったかな?

Advent Calendar 2015 への投稿

2つのカレンダーに投稿した。

txfonts のインテグラルのフォントを変える

txfonts の積分記号や総和記号は,他のフォントに変えることができる.

txfonts そのまま:
f:id:wgag:20181007194701p:plain
\int と \sum のフォントを変更:
f:id:wgag:20181007194659p:plain

例えば,\int, \oint, \sum, \prod のフォントを Computer Modern に戻すなら,プリアンブルに次のように書く.

\usepackage{txfonts}

\DeclareSymbolFont{cmlargesymbols}{OMX}{cmex}{m}{n}
\DeclareMathSymbol{\intop}{\mathop}{cmlargesymbols}{"5A}
  \def\int{\intop\nolimits}
\DeclareMathSymbol{\ointop}{\mathop}{cmlargesymbols}{"49}
  \def\oint{\ointop\nolimits}
\DeclareMathSymbol{\sumop}{\mathop}{cmlargesymbols}{"58}
  \let\sum\sumop
\DeclareMathSymbol{\prodop}{\mathop}{cmlargesymbols}{"59}
  \let\prod\prodop

{cmex} の代わりに {ztmcm} と書けば,mathptmx のフォントを借りてくることもできる.

文字コード表は,次のように tex testfont を実行すると得られる (cmex9 の文字コード表).

% tex testfont
Name of the font to test = cmex9
* \table
* \end

この文字コード表にない \iint などのフォントを変えるには,txfonts.sty を直接編集する.次の 2 行をコメントアウトすれば,\iint がデフォルトのフォントで出力される.

\re@DeclareMathSymbol{\iintop}{\mathop}{largesymbolsA}{33}
   \def\iint{\iintop\nolimits}

ちなみに,txfonts の改良版である newtx パッケージというのもあるが,使ってみた感じではまだバグが目立つ気がする.

参考文献

pxfonts (txfonts) の記号の一部を変える
http://perikanfan.web.fc2.com/tex.html
Mathptmx - TeX Wiki
http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Mathptmx