SKILL (プログラミング言語)

（スキル） はLISP系のスクリプト言語であり、ケイデンス・デザイン・システムズ社製の多くのEDA製品 （Cadence Allegro、Cadence Virtuoso等）で使われる「PCell」を記述するための言語である。その始めは1990年のIEEEの論文での提案にある。
歴史.
言語の始まりはカリフォルニア大学バークレー校のリチャード・フェイトマン教授の学生によってつくられた言語 である。「」の名称は他の語の語の頭文字ではない。公式の商標は全ての文字を大文字で表記する「」であるため、ケイデンス・デザイン・システムズ社は、大文字表記が好ましいとしている。 言語などの多くの系の言語はが策定した系の言語の標準言語である「」に取って代わられた。
現在「言語」として知られているものは、当初、「IL言語」として知られていた。言語はIL言語の関数ライブラリーであった。当時、その関数ライブラリーは「」と呼ばれていたが、後に、発音が同じ普通の覚えやすい英単語「」に変更された。IL言語は純然たるインターフェース言語であった。一方、も当初は言語というよりも、APIを記述するために使われていたものであったが、名前としては、より洒落た「」の方が定着した。「IL」という名前は言語プログラムファイルの標準的な拡張子「.il」に名残を留めている。
文法.
言語のプログラムには意味が等価な2つの書法がある。系の言語に伝統的なS式によるのようなものと、のような、C言語に似たものである。2つの書法はプログラム中で混在可能だが、C言語類似の書法の場合は、C言語とは違い、関数名と開き括弧の間に空白文字を入れて、のように書くことはできない。
いくつかの算術演算子は中置記法で書くことができる。例えば、
 (plus 1 2)
 plus(1 2)
 1+2
これらは、いずれも正しい書き方である。このようなC言語に似せた書法は、C言語や類似の書法を持つ他の手続き型言語の経験者がのコードを容易に理解できるよう導入された。C言語との違いとして、SKILL言語の全ての変数は動的スコープである。
言語の関数群には製品固有のものがいくつかある。例えば、製品「」では、「codice_1関数」など、「axl」で始まる固有の関数群があり、製品「」では、「codice_2関数」など、「cn」で始まる固有の関数群がある。
サンプル.
基本的な「」プログラムは以下のように記述する。
階乗を計算する関数は以下のようになる。
 (if (leqp n 1)
 1
 (times n (factorial (difference n 1)))
)
ここで、codice_3 のかわりに codice_4 としても正常に動作する。codice_3 と codice_6 に大きな違いはなく、codice_3 は codice_6 の一種である。codice_6 は最初の引数として関数名と引数を1つの引数と考えセットで取る。一方、codice_3 は最初の引数として関数名を取り、二つ目の引数で引数を取るようになっている。
C言語類似の書法では、長いプログラムコードでは、S式書法での等価なコードとは見かけが全く異なるものになる。
define( factorial(n)
 if( n<=1 then
 1
 else
 n * factorial(n-1)
)
次の例は、特殊フォーム「codice_11」を使い変数へ代入する方法と、特殊フォーム「codice_12」を使い変数スコープを区切る方法を示す。
 (let ((a 1) (b 2))
 (setq c a)
 (setq a b)
 (setq b c)
 (printf "a=%d, b=%d, c=%d\n" a b c)
)
変数 codice_13 と codice_14 は、特殊フォーム codice_12 で局所化されるが、変数 codice_16 は、そうなっていない。そのため、変数 codice_16 は、関数 codice_18 の外からもアクセス可能。次のコードは関数 codice_18 の実行結果として、変数 codice_13、codice_14、codice_16 の内容を出力したもの。
> (swap)
a=2, b=1, c=1
t
> a
> b
> c
1
注釈は、伝統的な他の系言語と同じく、セミコロン「;」で区切って書く。C言語などの他の言語と同じように長い範囲でコメントアウトしたい時には/* ~ */ といったコメント文も有効である。
(car mylist) ; セミコロンから行末までは注釈。
また、C言語と同じ書き方もできる。
/* 注釈 */ car(mylist) /* 別の注釈 */