Looking for:
Windows 10 change environment variables command line 自由. Contents(目次)How to Add Environment Variable in Windows 10.set variable - 和訳 – Linguee辞書
More information about CGI processing for newLISP server modes can be found in the document Code Patterns in newLISP. Environment variables can be read using the env function.
このモードは net-connect 、 net-listen 、 net-eval のローカル・デーモン・ソケット・モードと共に動作します。 net-accept 、 net-receive 、 net-send を使って、 net-connect と net-listen で開くローカル・デーモン・ソケットを提供できます。 net-peek と net-select を使って、ローカル・デーモン・ソケット接続を監視できます。 This mode will work together with local domain socket modes of net-connect , net-listen , and net-eval.
Local domain sockets opened with net-connect and net-listen can be served using net-accept , net-receive , and net-send. Local domain socket connections can be monitored using net-peek and net-select. This mode is not available on MS Windows. A newLISP Server will disconnect when no further input is read after accepting a client connection.
The timeout is specified in micro seconds:. inetd starts a newLISP process for each client connection. When a client disconnects, the connection is closed and the newLISP process exits. newLISP はメモリ使用量が少ない上に実行も早く、プログラムのロード時間も短いので、 inetd と newLISP の組み合わせは複数の接続を効率良く処理します。 net-eval を使って動作させる時、このモードが好まれるのは、分散処理環境で複数の 要求 ( リクエスト ) を効率良く処理するためです。 inetd and newLISP together can handle multiple connections efficiently because of newLISP's small memory footprint, fast executable, and short program load times.
When working with net-eval , this mode is preferred for efficiently handling multiple requests in a distributed computing environment. services と inetd. conf で見つかります。 Two files must be configured: services and inetd. 次の行のどちらかを inetd. conf に置いてください: Put one of the following lines into inetd. root の代わりに別のユーザとオプション・グループを指定できます。 詳細は、 inetd の Unix man ページ を見てください。 Instead of root , another user and optional group can be specified. For details, see the Unix man page for inetd. ファイル services には次の行を置いてください: The following line is put into the services file:.
他の構成オプションは xinetd と xinetd. conf の man ページを見てください。 See the man pages for xinetd and xinetd. conf for other configuration options. デーモンを設定した後、新規または変更した構成ファイルを読み込ませるために、 inetd あるいは xinetd を(訳注:次のようにして)再起動する必要があります: After configuring the daemon, inetd or xinetd must be restarted to allow the new or changed configuration files to be read:.
プロンプトなしの newLISP コマンドラインで入力されたかのように、 newLISP は全てを処理します。 inetd セットアップをテストするために telnetプログラムを使用できます: newLISP handles everything as if the input were being entered on a newLISP command-line without a prompt.
To test the inetd setup, the telnet program can be used:. newLISP サーバ・ノード は、 HTTP GET と PUT の 要求 ( リクエスト ) に返答します。 これは、 get-url 、 put-url 、 read-file 、 write-file 、 append-file によるファイルの取り出しや保存、および、 load と save を使っての リモート・サーバ・ノードへのプログラムのロードとセーブを 可能にします。 newLISP server nodes answer HTTP GET and PUT requests. This can be used to retrieve and store files with get-url , put-url , read-file , write-file and append-file , or to load and save programs using load and save from and to remote server nodes.
コマンド・ライン・フラグ -x を使い、ソース・コードと newLISP 実行部を一緒にして、自己完結アプリケーションを構築できます。 Source code and the newLISP executable can be linked together to build a self-contained application by using the -x command line flag. プログラム uppercase. lsp はコマンド・ライン上の最初の単語を取り、それを大文字に変換します。 The program uppercase. lsp takes the first word on the command-line and converts it to uppercase. 次のようなステップで自己完結アプリケーションを構築します: To build this program as a self-contained executable, follow these steps:. newLISP は実行環境のパスで newLISP 実行部を探し、ソース・コードのコピーとリンクします。 newLISP will find a newLISP executable in the execution path of the environment and link a copy of the source code.
Linux や 他の UNIX では、現ディレクトリが実行パスでない場合は: On Linux and other UNIX, if the current directory is not in the executable path:.
リンクしたプログラムは、起動時に初期化ファイル init. lsp あるいは. lsp をロードしないので注意してください。 Note that neither one of the initialization files init. lsp nor. lsp is loaded during startup of linked programs. コマンドラインで指定されたファイルをロードする前、そして、バナーやプロンプトが示される前に、 newLISP はホーム・ディレクトリから.
newLISP tries to load a file. lsp from the home directory of the user starting newLISP. On macOS, Linux and other Unix the home directory is found in the HOME environment variable. lsp ファイルのロードを試みます。 If a. lsp cannot be found in the home directory newLISP tries to load the file init.
The full path-name of the initialization file must be specified. newLISP が走るために init. lsp は必要ありませんが、関数やシステム共通変数を定義するのに便利です。 Although newLISP does not require init. lsp to run, it is convenient for defining functions and system-wide variables. リンク・プログラム のスタートアップ中は、初期化ファイル init. lsp のどちらもロードされないので、注意してください。また、 -n 、 -h 、 -x オプションの何れかでもロードされません。 Note that neither one of the initialization files init. lsp is loaded during startup of linked programs or when one of the options -n , -h , -x is specified.
Unix や MS Windows の多くの共有ライブラリは newLISP の機能を拡張するために使えます。 例えば、グラフィカル・ユーザ・インターフェイス用ライブラリや暗号・復号用ライブラリ、データベース・アクセス用などがあります。 Many shared libraries on Unix and MS Windows systems can be used to extend newLISP's functionality. Examples are libraries for writing graphical user interfaces, libraries for encryption or decryption and libraries for accessing databases.
外部ライブラリから関数を導入するには、関数 import を使います。 外部ライブラリからのコールバック関数を登録するには、関数 callback を使います。 導入したライブラリ関数への入出力用フォーマットを簡単に実現できる関数として、 pack 、 unpack 、 get-char 、 get-string 、 get-int 、 get-long 等があります。 関数 cpymem は指定したアドレスを直接メモリーからメモリへコピーします。 The function import is used to import functions from external libraries.
The function callback is used to register callback functions in external libraries. Other functions like pack , unpack , get-char , get-string , get-int and get-long exist to facilitate formatting input and output to and from imported library functions. The fucntion cpymem allows direct memory-to-memory copy specifying addresses. Code Patterns in newLISP 文書の Extending newLISP の章も見てください。 See also the chapter Extending newLISP in the Code Patterns in newLISP document.
newLISP は共有ライブラリとしてもコンパイルできます。 Linux や BSD 等の Unix ではライブラリを newlisp. so から呼び出します。 Windows なら newlisp. dll 、macOS では newlisp. dylib です。 newLISP 共有ライブラリは他の共有ライブラリと同じようにして使えます。 newLISP 共有ライブラリは他のプログラム言語に newLISP 機能を導入するために必要なものです。 newLISP can be compiled as a shared library. On Linux, BSDs and other Unix flavors the library is called newlisp. On Windows it is called newlisp. dll and newlisp. dylib on macOS. A newLISP shared library is used like any other shared library. A newLISP shared library is only required for importing newLISP functionality into other programming languages.
導入できる主な関数は newlispEvalStr です。 この関数は eval-string のように newLISP の式からなる文字列を取り、結果を文字列のアドレスに保存します。 結果は get-string を使って取り出せます。 結果の文字列はコマンド・ライン・セッションの出力のように整形されます。 ライン・フィード終端文字は含まれますが、プロンプト記号は含みません。 The main function to import is newlispEvalStr.
Like eval-string , this function takes a string containing a newLISP expression and stores the result in a string address. The result can be retrieved using get-string.
The returned string is formatted like output from a command-line session. It contains terminating line-feed characters, but not the prompt string.
関数 newlispEvalStr の呼び出しで、コンソールに向けられる出力(例えば、戻り値や print 文)は、通常文字列ポインタの整数値で返されます。 このポインタを関数 get-string に渡すことで、出力にアクセスできます。(訳注: get-string )戻り値の(訳注:コンソールへの)出力を止めるには silent 命令を使ってください。 When calling newlispEvalStr , output normally directed to the console e.
return values or print statements is returned in the form of an integer string pointer. The output can be accessed by passing this pointer to the get-string function. To silence the output from return values, use the silent function.
newLISP compiled as a shared library の章を読んでください。 Since v. For more information read the chapter newLISP compiled as a shared library in the Code Patterns in newLISP document. zip を見てください。 newlisp-js-lib. js ライブラリやドキュメント、例題アプリケーションが入っています。 ブラウザ・ベースの簡単な newLISP 開発環境がここからアクセスできます: newlisp-js 。 このアプリケーションには、ほかの例題アプリケーションやドキュメントへのリンクが含まれています。 ダウンロード・リンクには、全パッケージがリンクされています。 Since version The library can be used to run newLISP clientr-side in a web browser, just like JavaScript or HTML.
An HTML page can host both, newLISP code and JavaScript code together. Both languages can call each other. For more information see the newlisp-js-x. zip distribution package which contains the library newlisp-js-lib. js , documentaion and example applications. A small newLISP development environment hosted in a browser can also be accessed here: newlisp-js The application contains links to another example application, documentation and a download link for the whole package.
JavaScript ライブラリとしてコンパイルされた newLISP には、 ウェブ・ブラウザ用 newLISP の API の新関数がつかされています。 newLISP compiled as a JavaScript library adds new functions linked from API for newLISP in a web browser.
この章は、newLISP 宣言文の評価と newLISP における整数と浮動小数点数の規則に関する短い紹介です。 The following is a short introduction to newLISP statement evaluation and the role of integer and floating point arithmetic in newLISP. load 関数を使った時、もしくは、コマンド・ライン上のコンソールで式を入力した時、トップ・レベルの式が評価されます。 Top-level expressions are evaluated when using the load function or when entering expressions in console mode on the command-line.
最初に空行を入力することで、複数行の式を入力できます。 一旦、複数行モードに入り、再び入力モードに戻るには、空行を入力します。 そうすると、入力して宣言文一式が評価されます(出力は太字): Multiline expressions can be entered by entering an empty line first. Once in multiline mode, another empty line returns from entry mode and evaluates the statement s entered ouput in boldface :. 空行で enter キーを打って複数行モードに入ると、プロンプト表示が抑制されます。 もう一度空行を入力することで複数行モードから離れ、式が評価されます。 Entering multiline mode by hitting the enter key on an empty line suppresses the prompt.
Entering another empty line will leave the multiline mode and evaluate expressions. This mode is used by some interactive IDEs controlling newLISP and internally by the net-eval function. newLISP の関数や演算子は、整数と浮動小数点数を受け入れ、 必要な形式に変換します。 例えば、ビット操作演算子は浮動小数点数の小数部分を省いて整数に変換します。 同様に、三角関数は計算を実行する前、内部的に整数を浮動小数点数に変換しています。 newLISP functions and operators accept integer and floating point numbers, converting them into the needed format.
For example, a bit-manipulating operator converts a floating point number into an integer by omitting the fractional part. In the same fashion, a trigonometric function will internally convert an integer into a floating point number before performing its calculation. Functions and operators named with a word instead of a symbol e.
Integer operators truncate floating point numbers to integers, discarding the fractional parts. The arithmetic functions convert their arguments into types compatible with the function's own type: integer function arguments into integers, floating point function arguments into floating points.
In this case, floating point numbers can be converted into integers by using the function int. Likewise, integers can be transformed into floating point numbers using the float function:. This gives imported library functions maximum speed when performing address calculations.
Since version 8. 次の演算子、関数、述語が大整数に対して動作します: The following operators, functions and predicates work on big integers:. これらの演算子や関数の引数の一番目が大整数なら、大整数モードで計算を実行します。このマニュアルの 関数リファレンス 節では、これらの関数に bigint が記されています。 If the first argument in any of these operators and functions is a big integer, the calculation performed will be in big integer mode. In the Function Reference section of this manual these are marked with a bigint suffix. 文字通り、 より大きい数や より小さい数、または末尾に L のつく数は、大整数に変化され、そのモードで処理されます。 整数や浮動小数点や文字列形式からの変換には、関数 bigint が使えます。 bigint?
述語は大変数型かどうかをチェックします。 Literal integer values greater than or smaller than , or integers with an appended letter L, will be converted and processed in big integer mode. The function bigint can be used to convert from integer, float or string format to big integer. The predicate bigint?
checks for big integer type. 浮動小数点が混在するほとんどの場合、整数と大整数に違いはありません。 第二引数に必要な変換を関数が自動的に行います。 通常の整数や浮動小数点のみを使う場合のオーバーフローは、バージョン Functions automatically do conversions when needed on the second argument. The overflow behavior when using normal integers and floats only, has not changed from newLISP versions previous to コマンドラインで入力または編集された式を評価します。 複雑なプログラムは Emacs や VI のようなエディタを使って入力できます。 それらのエディタはタイプ中に対応する括弧を示すモードを持っています。 load 関数を使って、コンソール・セクションに保存したファイルを呼び戻せます Evaluate expressions by entering and editing them on the command-line.
More complicated programs can be entered using editors like Emacs and VI, which have modes to show matching parentheses while typing. Load a saved file back into a console session by using the load function. newLISP ignores this line during evaluation. コマンドラインで評価が起こると、結果はコンソール・ウィンドウに出力されます。 When evaluation occurs from the command-line, the result is printed to the console window. nil と true は、それ自身に評価される 論理データ型 です: nil and true are Boolean data types that evaluate to themselves:.
整数 と 大整数 と 浮動小数点 の数値は、それ自身に評価されます: Integers , big integers and floating point numbers evaluate to themselves:. Larger numbers converted from floating point numbers are truncated to one of the two limits.
浮動小数点数は IEEE の 64 ビット倍精度です。 format で特殊フォーマット文字を使えば、符号無しで 18,,,,,, まで、表示可能です。 Floating point numbers are IEEE bit doubles. Unsigned numbers up to 18,,,,,, can be displayed using special formatting characters for format.
大整数はメモリが許す限り、桁数に制限がありません。 大整数に必要なメモリは: Big integers are of unlimited precision and only limited in size by memory. The memory requirement of a big integer is:. ここで digits は十進数桁数、 bytes は 8 ビット、 ceil は次に大きい整数に丸める切り上げ関数です。 Where digits are decimal digits, bytes are 8 bits and ceil is the ceiling function rounding up to the next integer.
文字列 は null 文字も含めることができ、異なる終端を持つことが可能です。 文字列もそれ自身に評価されます。 Strings may contain null characters and can have different delimiters. They evaluate to themselves. newLISP automatically uses these tags for string output longer than 2, characters. ラムダとラムダ・マクロ式 は、それ自身に評価されます: Lambda and lambda-macro expressions evaluate to themselves:. It is displayed when printing a built-in primitive. クォート式 は評価されると、一個の '(シングル・クォート)を失います: Quoted expressions lose one ' single quote when evaluated:.
シングル・クォートは、しばしば式を評価から 保護 するのに使われます。 (例えば、シンボル自身をその内容に代わりに参照したい時や、データを表現するリストを参照したい時)。 A single quote is often used to protect an expression from evaluation e. リスト は(Scheme と同様に)リストの第一要素が評価されてから、式の残りが評価されます。 第一要素の評価結果がリストの残りの要素に適用されますので、第一要素は lambda 式、 lambda-macro 式、 primitive (組込)関数のどれかでなければなりません。 Lists are evaluated by first evaluating the first list element before the rest of the expression as in Scheme. The result of the evaluation is applied to the remaining elements in the list and must be one of the following: a lambda expression, lambda-macro expression, or primitive built-in function.
newLISP はユーザ定義ラムダ式において、引数を左から右へと評価して、パラメータに(左から右へ)束縛して、その結果を式本体で使います。 For a user-defined lambda expression, newLISP evaluates the arguments from left to right and binds the results to the parameters also from left to right , before using the results in the body of the expression. Scheme のように newLISP は式の ファンクタ (関数オブジェクト)部分を評価して、その引数に適用します: Like Scheme, newLISP evaluates the functor function object part of an expression before applying the result to its arguments.
For example:. lambda-macro 式は引数を評価しないので、言語の構文を拡張する使えます。。 ほとんどの組込関数は実行時に(必要な時)引数を左から右へ評価します。 この規則の例外については、このマニュアルのリファレンス部分に示してあります。 引数の全てか一部を評価しない Lisp 関数は 特殊形式 と呼ばれます。 Because their arguments are not evaluated, lambda-macro expressions are useful for extending the syntax of the language. Most built-in functions evaluate their arguments from left to right as needed when executed.
Some exceptions to this rule are indicated in the reference section of this manual. Lisp functions that do not evaluate all or some of their arguments are called special forms. シェル・コマンド :コマンドライン上で第一文字が! ls や MS Windows の!
dir は、現在の作業ディレクトリの(訳注:ファイルの)リストを表示させます。! で始まるシンボルは内部式として許容され、コマンドライン上ではスペースを先行することでシンボルとして認識されます。 注記:このモードはシェル上で走っている時のみ動作し、他のアプリケーションから newLISP を制御している時は動作しません。 Shell commands : If an! exclamation mark is entered as the first character on the command-line followed by a shell command, the command will be executed.
For example,! ls on Unix or! dir on MS Windows will display a listing of the present working directory. No spaces are permitted between the! and the shell command. Symbols beginning with an! are still allowed inside expressions or on the command-line when preceded by a space. Note: This mode only works when running in the shell and does not work when controlling newLISP from another application.
他のアプリケーションでシェル・コマンドにアクセスする時や newLISP に結果を渡したい時は、関数 exec を使ってください。 Use the exec function to access shell commands from other applications or to pass results back to newLISP. newLISP におけるラムダ式は、それ自身に評価され、正規のリストと同様に扱われます: Lambda expressions in newLISP evaluate to themselves and can be treated just like regular lists:. 注記:newLISP では、ラムダ式の前に ' は必要ありません。ラムダ式が、それ自身に評価されるからです。 Note: No ' is necessary before the lambda expression because lambda expressions evaluate to themselves in newLISP.
ラムダ式は ラムダ・リスト という リスト の一形態であり、その引数は左から右、あるいは、右から左へと連結可能です。 例えば、 append を使うと、左の引数が右に引数とつながります: A lambda expression is a lambda list , a subtype of list , and its arguments can associate from left to right or right to left. When using append , for example, the arguments associate from left to right:. 一方、 cons は右の引数(訳注:の先頭)に左の引数を入れます: cons , on the other hand, associates the arguments from right to left:.
lambda キーワードはリスト中のシンボルではなく、 ラムダ・リスト というリストの特殊 型 の指定子であることに注意してください。 Note that the lambda keyword is not a symbol in a list, but a designator of a special type of list: the lambda list. ラムダ式はユーザ定義の無名関数として、map または apply の引数にすることができます: Lambda expressions can be mapped or applied onto arguments to work as user-defined, anonymous functions:. 一ラムダ式を一シンボルに割り付け、関数として使うことができます: A lambda expression can be assigned to a symbol, which in turn can be used as a function:.
関数 define はラムダ式をシンボルに割り付ける簡単な方法です: The define function is just a shorter way of assigning a lambda expression to a symbol:. 上の例で、ラムダ・リスト内の式は double の中身としてアクセス可能です: In the above example, the expressions inside the lambda list are still accessible within double :.
リストを操作する関数を使かえば、ラムダ・リストをファースト・クラス・オブジェクトのように操作できます: A lambda list can be manipulated as a first-class object using any function that operates on lists:. ラムダ式に与えられる引数は全てオプションであり、ユーザの指定がない時はデフォルトで nil が割り当てられます。 これにより、多様な変数を定義する関数を書くことが可能になります。 All arguments are optional when applying lambda expressions and default to nil when not supplied by the user.
This makes it possible to write functions with multiple parameter signatures. newLISP において nil と true は共にシンボルで、論理値の 偽(false) と 真(true) を表します。 nil と true 内容によっては異なる扱いを受けます。 次からの例は nil を使いますが、単に論理を逆にすることによって true にも適用できます。 In newLISP, nil and true represent both the symbols and the Boolean values false and true.
Depending on their context, nil and true are treated differently. The following examples use nil , but they can be applied to true by simply reversing the logic. nil の評価は論理値の偽をもたらし、 if , unless , while , until , not のようなフロー制御式内部で偽として取り扱われます。 同様に true の評価は真をもたらします。 Evaluation of nil yields a Boolean false and is treated as such inside flow control expressions such as if , unless , while , until , and not.
Likewise, evaluating true yields true. 上の例では nil はシンボルです。 次の例では nil と true が評価され、論理値になります: In the above example, nil represents a symbol. In the following example, nil and true are evaluated and represent Boolean values:. newLISP では他の Lisp と違って、 nil と空リスト が同じではありません。 両者が論理値の偽として扱われるのは、 and , or , if , while , unless , until , cond の条件式においてのみです。 In newLISP, nil and the empty list are not the same as in some other Lisps. Only in conditional expressions are they treated as a Boolean false, as in and , or , if , while , unless , until , and cond.
nil は空リストではなく、論理値として扱われるので、 cons 'x ' の評価は x となりますが、 cons 'x nil は x nil になります。 newLISP では、二つのアトムのコンス( cons )はドット対にならず、二つの要素のリストになります。 述語 atom? は nil に対して 真(true)ですが、空リストに対しては 偽(false)です。 newLISP では、空リストは単なる空のリストであり、 nil ではありません。 Evaluation of cons 'x ' yields x , but cons 'x nil yields x nil because nil is treated as a Boolean value when evaluated, not as an empty list.
The cons of two atoms in newLISP does not yield a dotted pair, but rather a two-element list. The predicate atom?
is true for nil , but false for the empty list. The empty list in newLISP is only an empty list and not equal to nil. newLISP で一つのリストは、リストの形をした一 newLISP セルです。 それはリストセルの中身を形作る要素を連結するリストの入れ物のようなものです。 newLISP に ドット対 はありません。 なぜなら、Lisp セルの cdr (tail)部が常に他の Lisp セルを指し示し、けして、数値やシンボルのような基本データ型を指し示さないからです。 car (head)部のみが基本データ型になりえます。 初期の Lisp 実装では、 head と tail の名前として car と cdr を使っていました。 A list in newLISP is a newLISP cell of type list. It acts like a container for the linked list of elements making up the list cell's contents.
There is no dotted pair in newLISP because the cdr tail part of a Lisp cell always points to another Lisp cell and never to a basic data type, such as a number or a symbol. Only the car head part may contain a basic data type. Early Lisp implementations used car and cdr for the names head and tail. newLISP のアレイは大規模リストの高速アクセスを可能にします。 関数 array を使って、新規アレイを構築し、既存リストの内容で初期化します。 リストをアレイに変換することもでき、その逆もできます。 リストの変更やアクセスに使用する関数のほとんどが、アレイにも同じように適用できます。 アレイにはどのようなデータ型も収めることができ、その組み合わせもしかりです。 newLISP's arrays enable fast element access within large lists.
New arrays can be constructed and initialized with the contents of an existing list using the function array. Lists can be converted into arrays, and vice versa. Most of the same functions used for modifying and accessing lists can be applied to arrays, as well. Arrays can hold any type of data or combination thereof. アレイの生成・アクセス・変更に、特に使われるのが次の関数群です: In particular, the following functions can be used for creating, accessing, and modifying arrays:.
newLISP はアレイをアレイ化して、多次元アレイを表します (すなわち、アレイの要素が、アレイ自身ということ)。 newLISP represents multidimensional arrays with an array of arrays i. インターラクティブに使われている時、newLISP はアレイをリストのように出力・表示するので、それらを区別できません。 When used interactively, newLISP prints and displays arrays as lists, with no way of distinguishing between them.
アレイ(または、アレイを含む変数)を 直列化 ( シリアライズ ) するには、関数 source か save を使ってください。 そうすれば、アレイの 直列化 ( シリアライズ ) 時に array 宣言文が定義部分に含まれます。 Use the source or save functions to serialize arrays or the variables containing them. The array statement is included as part of the definition when serializing arrays. リストと同様に、アレイの最後の要素から数え始める負数インデックスが使えます。 Like lists, negative indices can be used to enumerate the elements of an array, starting from the last element.
アレイまたはリストでインデックスが境界を超えると、エラー・メッセージが発生します。 An out-of-bounds index will cause an error message on an array or list. 正方でないアレイを作ることはできますが、 source や save を使って 直列化 ( シリアライズ ) する際に正方化されます。 関数 array が、常に正方形式アレイを構築するからです。 Arrays can be non-rectangular, but they are made rectangular during serialization when using source or save.
The array function always constructs arrays in rectangular form. 行列関数 det , transpose , multiply , invert は、 入れ子リストで構築された行列や array で構築されたアレイで使うことができます。 The matrix functions det , transpose , multiply , and invert can be used on matrices built with nested lists or arrays built with array. 詳細は、このマニュアルの array , array? The positive indices run 0, 1, …, N-2, N-1 , where N is the number of elements in the list.
Adding N to the negative index of an element yields the positive index. Unless a function does otherwise, an index greater than N-1 or less then -N causes an out-of-bounds error in lists and arrays.
暗黙の要素指定は、リストとアレイの要素や文字列中の文字を取り出す nth の代わりに使えます: Implicit indexing can be used instead of nth to retrieve the elements of a list or array or the characters of a string:. インデックスにはリストも使えます。 その際の暗黙の要素指定は push 、 pop のようなインデックス・ベクターを引数とする関数で使い、また ref 、 ref-all のようなインデックス・ベクターを生成する関数もあります。 Indices may also be supplied from a list. In this way, implicit indexing works together with functions that take or produce index vectors, such as push , pop , ref and ref-all.
暗黙の要素指定は newLISP の構文ルールを壊しませんが、s式のファンクタ(関数オブジェクト)位置において、他のデータ型に対する既存のルールを拡張することに注目してください。 オリジナルの Lisp では s式リストの第一要素が関数となり、残りの要素を引数とします。 newLISP ではリストがs式のファンクタ(関数オブジェクト)位置に置かれると、リスト自身が自己インデックス関数のように機能し、それに続くインデックスを引数に使います。(訳注:オリジナルの Lisp では newLISP のように、s式リストの第一要素にリストを置くことができません。) Note that implicit indexing is not breaking newLISP syntax rules but is merely an expansion of existing rules to other data types in the functor position of an s-expression.
In original Lisp, the first element in an s-expression list is applied as a function to the rest elements as arguments. In newLISP, a list in the functor position of an s-expression assumes self-indexing functionality using the index arguments following it. 暗黙の要素指定は明示形式よりも速く動作し、明示形式は内容によっては可読性を良くします。 Implicit indexing is faster than the explicit forms, but the explicit forms may be more readable depending on context.
UTF-8 版 newLISP では、文字列への暗黙の要素指定や nth の使用は、1バイト境界ではなく、文字境界で作用します。 Note that in the UTF-8—enabled version of newLISP, implicit indexing of strings or using the nth function work on character rather than single-byte boundaries. デフォルト・ファンクタ は、コンテキスト内でコンテキスト自身と同じ名前を持つファンクタ(関数オブジェクト)です。 コンテキスト・デフォルト・ファンクタ の章を見てください。 デフォルト・ファンクタは、リストを参照する機構として用意された暗黙の要素指定と一緒に使うことができます。 The default functor is a functor inside a context with the same name as the context itself. See The context default function chapter.
A default functor can be used together with implicit indexing to serve as a mechanism for referencing lists:. この例で aList は MyList:MyList をコピーすることなく、参照しています。 このコンテキストについての詳細情報は コンテキストを含む変数 を見てください。 In this example, aList references MyList:MyList , not a copy of it.
For more information about contexts, see Variables holding contexts. インデックスされたデフォルト・ファンクタは、次の例で示すように setf と共に使うこともできます: The indexed default functor can also be used with setf as shown in the following example:. rest や slice 的な暗黙形式は、リストに先行する一つないし二つの数値で形成され、それぞれオフセットと長さを表します。 長さが負数の場合は、リストや文字列の終端から数えます(訳注:この場合、終端を 0 と数えるので、リストや文字列の終端まで切り出す時は負数の長さを指定できない): Implicit forms of rest and slice can be created by prepending a list with one or two numbers for offset and length.
If the length is negative it counts from the end of the list or string:. UTF-8 版 newLISP で、(訳注:文字列に使う)関数 rest 、 first 、 last はマルチバイト境界で作用します。 しかし、 rest や slice 的な暗黙の要素指定形式は常に 1 バイト境界で作用するので、(訳注:UTF-8 版 newLISP でも)バイナリ・データに使えます。 正規表現関数 find と regex からのオフセットと長さの結果も 1 バイト単位でカウントされるので、 slice やその暗黙形式と一緒に使えます。 The functions rest , first and last work on multi-byte character boundaries in UTF-8 enabled versions of newLISP.
But the implicit indexing forms for slicing and resting will always work on single-byte boundaries and can be used for binary content. Offset and length results from the regular expression functions find and regex are also in single-byte counts and can be further processed with slice or it's implicit form.
インデックスで参照されるリスト、アレイ、文字列の部分は setf を使って変更可能です: Parts in lists, arrays and strings referenced by indices can be modified using setf :. 全部が要素だけでも入れ子のリストでもアレイでも、この方法を使って変更できます。 暗黙の rest や slice を使って取り出す部分リストや部分アレイは、 setf を使って直接置き換えることができません。要素毎に置き換えましょう。 文字列では、一度に置き換えられるのは一文字だけですが、複数文字からなる文字列に置き換えることは可能です。 Note that only full elements or nested lists or arrays can be changed this way.
Slices or rest parts of lists or arrays as used in implicit resting or slicing cannot be substituted at once using setf , but would have to be substituted element by element. In strings only one character can be replaced at a time, but that character can be replaced by a multi-character string.
newLISP 組込の多くは非破壊的( 副作用 無し)で、既存のオブジェクトに触らず残しますが、その代わりに新しいオブジェクトを作ります。 とは言え、数は少ないですが、変数・リスト・アレイ・文字列の内容を 変更する 関数もあります: Most of the primitives in newLISP are nondestructive no side effects and leave existing objects untouched, although they may create new ones.
There are a few destructive functions, however, that do change the contents of a variable, list, array, or string:. 破壊的関数の中には、目標オブジェクトを関数 copy で包み、非破壊的関数にできるものもあります。 Some destructive functions can be made non-destructive by wrapping the target object into the copy function.
以下の記述は、ループや begin 式内のフロー制御を中断する方法です。 What follows are methods of interrupting the control flow inside both loops and the begin expression. ループ機能 dolist 、 dotimes には、ループから早期に脱出する条件式をオプションで取ることができます。 catch と throw はループ本体から脱出する汎用形式であり、他の形式または制御ブロックに適用することもできます。 The looping functions dolist and dotimes can take optional conditional expressions to leave the loop early.
catch and throw are a more general form to break out of a loop body and are also applicable to other forms or statement blocks. newLISP は関数型言語なので、関数や繰り返しからの脱出に break 宣言文や return 宣言文を使いません。 代わりに、関数 catch と throw を使って、関数や繰り返しのいかなる場所からも脱出できます: Because newLISP is a functional language, it uses no break or return statements to exit functions or iterations. Instead, a block or function can be exited at any point using the functions catch and throw :. この例は、繰り返しを N 回実行する前に脱出する方法を示しています。 The example shows how an iteration can be exited before executing N times.
throw を使えば、複数の場所からの戻りを記述できます: Multiple points of return can be coded using throw :. condition-A が真なら x が catch 式から戻り、 condition-B が真なら戻り値は y になります。 それ以外では、 foo5 の結果が戻り値として使われます。 If condition-A is true, x will be returned from the catch expression; if condition-B is true, the value returned is y.
Otherwise, the result from foo5 will be used as the return value. catch の代わりとして、 誤ったコードやユーザ定義例外によって起こるエラーを捕まえるために、関数 error-event が使えます。 As an alternative to catch , the error-event function can be used to catch errors caused by faulty code or user-initiated exceptions.
関数 throw-error は、ユーザ定義エラーを発生するために使います。 The throw-error function may be used to throw user-defined errors. 論理関数 and と or を使って、宣言文ブロックに内包する関数の論理値結果次第で脱出するよう構成できます: Using the logical functions and and or , blocks of statements can be built that are exited depending on the Boolean result of the enclosed functions:.
この and 式はブロック中の関数が nil か empty list を返すと、すぐに戻ります。 先行する関数群がどれもブロックからの脱出を起こさなければ、最後の関数の結果が返ります。 The and expression will return as soon as one of the block's functions returns nil or an empty list. If none of the preceding functions causes an exit from the block, the result of the last function is returned. この or 式の結果を返すのは nil でも なく 、 でも ない 値を返す最初の関数です。 The result of the or expression will be the first function that returns a value which is not nil or.
newLISP はコンテキスト 内で ダイナミック・スコープを使っています。 コンテキストはレキシカルに閉じた名前空間です。 この方法により、newLISP のプログラム部品は レキシカル・スコープ の利点を取る別々の名前空間で活かされます。 newLISP uses dynamic scoping inside contexts.
A context is a lexically closed namespace. In this way, parts of a newLISP program can live in different namespaces taking advantage of lexical scoping. ラムダ式の変数シンボルが引数に束縛されると、古い束縛はスタックにプッシュされます。 ラムダ式から離れると、newLISP が自動的に元の変数束縛に復帰させます。 When the parameter symbols of a lambda expression are bound to its arguments, the old bindings are pushed onto a stack.
newLISP automatically restores the original variable bindings when leaving the lambda function. 次の例は ダイナミック・スコープ の動作を示しています。 ここでボールドのテキストは newLISP の出力です: The following example illustrates the dynamic scoping mechanism. The text in bold is the output from newLISP:. 変数 x は最初 1 に設定されています。 しかし、 g 0 が呼ばれて x は 0 に束縛されます。だから、 g 0 実行中、 f の出力する x は 0 になります。 g 0 の実行後に f を呼び出すと、再び x を 1 として出力します。 The variable x is first set to 1. But when g 0 is called, x is bound to 0 and x is reported by f as 0 during execution of g 0.
After execution of g 0 , the call to f will report x as 1 again. これが、ローカル変数の束縛が関数内部でのみ起こる C や Java のような言語で見られる レキシカル・スコープ 動作との違いです。 C のようなレキシカル・スコープ言語では、 f はシンボル x のグローバル束縛として、常に 1 を出力します。 This is different from the lexical scoping mechanisms found in languages like C or Java, where the binding of local parameters occurs inside the function only. In lexically scoped languages like C, f would always print the global bindings of the symbol x with 1.
次のユーザ定義関数において、関数の引数と同じ名前の変数名をクォート付きシンボルで渡すことが、名前の衝突を起こすことに着目してください: Be aware that passing quoted symbols to a user-defined function causes a name clash if the same variable name is used as a function parameter:. Dynamic scoping's variable capture can be a disadvantage when passing symbol references to user-defined functions.
newLISP offers several methods to avoid variable capture. インターフェイスや関数ライブラリを作成する時は、コンテキストを使って関連する関数をグループ化すべきです。 これにより、レキシカルな〝壁〟で関数が囲われ、関数呼び出し時の変数名衝突が回避されます。 〝〟 Contexts should be used to group related functions when creating interfaces or function libraries. This surrounds the functions with a lexical "fence", thus avoiding variable name clashes with the calling functions. newLISP はレキシカル・スコープの異なる形式でコンテキストを使います。 詳細な情報は コンテキスト と デフォルト・ファンクタ の章を見てください。 newLISP uses contexts for different forms of lexical scoping.
See the chapters Contexts and default functors for more information. newLISPでは、 コンテキスト(contexts) と呼ばれる名前空間でシンボルを分離できます。 各コンテキストは、他の全てのコンテキストから隔離された個別のシンボル表を持っています。 一コンテキスト内のシンボルは他のコンテキストからは見えませんので、異なるコンテキストで同じ名前を使っても衝突しません。 In newLISP, symbols can be separated into namespaces called contexts.
Each context has a private symbol table separate from all other contexts. Symbols known in one context are unknown in others, so the same name may be used in different contexts without conflict. コンテキストは隔離された変数と関数の定義からなるモジュールの構築に使われます。 また、キー・値対の辞書を作るためにも使えます。 コンテキストはコピー可能で、動的に変数を割り当てられ、引数としても渡せます。 newLISP におけるコンテキストはレキシカルに分離された名前空間を持ちますので、 レキシカル・スコープ によるプログラミングとプログラミングのソフトウェア・オブジェクト形式を可能にします。 Contexts are used to build modules of isolated variable and function definitions.
They also can be used to build dictionaries fo key values pairs. Contexts can be copied and dynamically assigned to variables or passed as arguments by reference. Because contexts in newLISP have lexically separated namespaces, they allow programming with lexical scoping and software object styles of programming. コンテキストはシンボルのルート部分に明示されているか、コンテキスト MAIN です。 この章では、コンテキスト・シンボルに大文字を使っていますが、小文字も使えます。 Contexts are identified by symbols that are part of the root or MAIN context. Although context symbols are uppercased in this chapter, lowercase symbols may also be used.
コンテキスト MAIN はコンテキスト名であると同時に、組込関数のシンボル及び true や nil のような特殊シンボルを保持しています。 コンテキスト MAIN は newLISP を走らせる度に自動的に生成されます。 MAIN の全シンボルを見るには newLISP 開始後、次の式を入力してみてください: In addition to context names, MAIN contains the symbols for built-in functions and special symbols such as true and nil.
The MAIN context is created automatically each time newLISP is run. To see all the symbols in MAIN, enter the following expression after starting newLISP:. MAIN の全シンボルで使われているコンテキストを見るには: To see all symbols in MAIN pointing to contexts:. 現在のコンテキストが MAIN 以外にある時、 MAIN にある全コンテキスト・シンボルを見るには: To seel all context symbols in MAIN when MAIN is not the current context:.
次の規則により、 作成したシンボルがどのコンテキストに割り当てられるかが明確になり、コンテキストへの理解が簡単になるでしょう。 The following rules should simplify the process of understanding contexts by identifying to which context the created symbols are being assigned.
newLISP の各式の解析と翻訳は、トップ階層から始まります。 この解析中に全シンボルを生成します。 式は翻訳された後に、評価されます。 newLISP first parses and translates each expression starting at the top level. All symbols are created during this phase.
After the expression is translated, it gets evaluated. 関数 load 、 sym 、 eval-string が呼ばれた時、newLISP はシンボルを最初に 見つけた時 、生成します。 newLISP はソースの読み込み時に、評価が起こる 前 にシンボルを生成します。 関数 reader-event は、式を読み込み翻訳するがそれを評価する前に、その式を検査できます。 関数 read-expr は、newLISP のソースを評価することなく、読み込み翻訳するためだけに使えます。 A symbol is created when newLISP first sees it, while calling the load , sym , or eval-string functions.
When newLISP reads a source file, symbols are created before evaluation occurs. The reader-event function can be used to inspect the expression after reading and translating but before evaluation. The read-expr function can be used to read and translate newLISP source without evaluation.
コード翻訳中に見知らぬシンボルに出会うと、その定義の検索を現在のコンテキスト内で始めます。 検索に失敗すると、 MAIN 内で組込関数、コンテキスト、グローバル変数において検索を続けます。 定義が見つからなければ、そのシンボルが現在のコンテキスト内にローカルに生成されます。 When an unknown symbol is encountered during code translation, a search for its definition begins inside the current context.
Failing that, the search continues inside MAIN for a built-in function, context, or global symbol. If no definition is found, the symbol is created locally inside the current context. いったんシンボルが生成され、特定のコンテキストに割り当てられると、 そのシンボルは、関数 delete を使って削除されるまで、そのコンテキストに恒久的に従属します。 Once a symbol is created and assigned to a specific context, it will belong to that context permanently or until it is deleted using the delete function.
ユーザ定義関数の評価の際、そのシンボルを持っている名前空間にコンテキストが切り替わります。 When a user-defined function is evaluated, the context is switched to the name-space which owns that symbol. コンテキスト切り替えは load 、 sym 、 eval-string の間のシンボル生成にのみ、影響を及ぼします。 ロードされたファイルのトップ階層でコンテキスト切り替えが起こる時以外は、 load はデフォルトで MAIN にロードします。 より良い使い方は、関数 sym と eval-string を使う時に、コンテキストを常に指定することです。 コンテキスト切り替えは関数内部でなく、通常プログラムのトップ階層でのみ起こります。 A context switch only influences symbol creation during load , sym , or eval-string.
load by default loads into MAIN except when context switches occur on the top level of the file loaded.
For better style, the context should always be specified when the functions sym and eval-string are used. A context switch should normally only be made on the top level of a program, never inside a function. コンテキストは関数 context の使用または暗黙の生成、いずれかで生成されます。 最初の方法は同じコンテキストに従属する多量のコードを書く時に使われます: Contexts can be created either by using the context function or via implicit creation. The first method is used when writing larger portions of code belonging to the same context:. コンテキストがまだ存在していないなら、コンテキスト・シンボルはクォートされていなければなりません。 コンテキストは、それ自身に評価されるので、MAIN のように既に存在するコンテキストはクォートを必要としません。 If the context does not exist yet, the context symbol must be quoted.
If the symbol is not quoted, newLISP assumes the symbol is a variable holding the symbol of the context to create. Because a context evaluates to itself, already existing contexts like MAIN do not require quoting. 上記 newLISP コードを読み込む時、最初の宣言文 context 'FOO が評価されます。 これが newLISP に FOO への名前空間切り替えを起こさせ、残りの式を読み込んで評価する際に、以下のシンボル var 、 x 、 y 、 z 全てがコンテキスト FOO 内に生成されます。 When newLISP reads the above code, it will read, then evaluate the first statement: context 'FOO.
This causes newLISP to switch the namespace to FOO and the following symbols var , x , y and z will all be created in the FOO context when reading and evaluating the remaining expressions.
コンテキスト・シンボルは変更から保護されています。一回でもコンテキスト用に使われたシンボルは、 delete を使わなければ、他の用途に使うことはできません。 A context symbol is protected against change.
Once a symbol refers to a context, it cannot be used for any other purpose, except when using delete. 名前空間 FOO の外から var や func を参照するには、コンテキスト名の先付けが必要です: To refer to var or func from anywhere else outside the FOO namespace they need to be prefixed with the context name:.
注記、上記例で名前空間 FOO に属しているのは func だけです。 シンボル p q r は全て、 FOO:func の呼び出しで作られますが、現在のコンテキストの一部です。 Note, that in the above example only func belongs to the FOO name space the symbols p q r all are part of the current context from which the FOO:func call is made. コンテキストに所属する全てのシンボルを表示するために、関数 symbols が使えます: The symbols function is used to show all symbols belonging to a context:. まだ存在していないコンテキストが参照された時は、暗黙に生成されます。 関数 context とは違い、コンテキストが切り替わりません。 続く宣言文は、全て MAIN コンテキスト内で実行されます: A context is implicitly created when referring to one that does not yet exist.
Unlike the context function, the context is not switched. The following statements are all executed inside the MAIN context:. コンテキスト名を先付けしたシンボルだけが、コンテキストのシンボルになることに気をつけてください: Note that only the symbols prefixed with their context name will be part of the context:. 上記コードが MAIN にロードされると、 foo のみが ACTX のシンボルです。 シンボル x と y は、まだ MAIN のシンボルです。 ACTX:foo の構成要素を全て ACTX コンテキスト内に作るには、 ACTX を先付するか、 トップ階層でコンテキスト切り替えを実施してから、関数を定義する必要があります。 When above code is loaded in MAIN only foo will be part of ACTX.
The symbols x and y will still be part of MAIN. To make all locals of ACTX:foo members of the ACTX context, they would either have to be prefixed with ACTX , or the whole funtion must be preceded by a context switch satement at the top level:. LSP ;; ;; everything from here on goes into GRAPH context 'GRAPH define draw-triangle x y z … define draw-circle … ;; show the runtime context, which is GRAPH define foo context ;; switch back to MAIN context 'MAIN ;; end of file 関数 draw-triangle と draw-circle —変数 x 、 y 、 z を伴う—はコンテキスト GRAPH の部品です。 これらのシンボルは GRAPH にとってのみ既知です。 これらの関数を他のコンテキストから呼び出すには GRAPH: を先付けします: The draw-triangle and draw-circle functions — along with their x , y , and z parameters — are now part of the GRAPH context.
These symbols are known only to GRAPH. To call these functions from another context, prefix them with GRAPH:. 最後の宣言文は、実行中のコンテキストを(function foo の context である) GRAPH に切り替える方法です。 The last statement shows how the runtime context has changed to GRAPH function foo 's context.
他のコンテキストからシンボル同士を比較する時は、シンボルの名前とコンテキストの両方を使います。 全修飾シンボルから名前部分を取り出すには関数 term を使います。 A symbol's name and context are used when comparing symbols from different contexts. The term function can be used to extract the term part from a fully qualified symbol. 注記:上記例のシンボルが ' single quote でクォートされているのは、シンボルのコンテキストではなく、シンボル自身を対象にしているからです。 Note: The symbols in above example are quoted with a ' single quote because we are interested in the symbol itself, not in the contents of the symbol.
デフォルトでは組込関数と nil や true のような特殊シンボルのみが、 MAIN 以外のコンテキスト内でも見ることができます。 どのコンテキストでもシンボルが見られるようにするには関数 global を使います: By default, only built-in functions and symbols like nil and true are visible inside contexts other than MAIN.
To make a symbol visible to every context, use the global function:. global 宣言文を使わなければ、二番目の aVar は の代わりに nil を返すでしょう。 FOO が前もって定義されたシンボル(この例では aVar )を持っているなら、代わりに—グローバルのシンボルではなく— その シンボル(訳注:FOO:aVar)の値が返ります。 コンテキスト MAIN 上でのみ、シンボルをグローバルにできることに注意してください(訳注:関数 global は MAIN 上でしか使えないということ)。 Without the global statement, the second aVar would have returned nil instead of If FOO had a previously defined symbol aVar in this example that symbol's value — and not the global's — would be returned instead.
Note that only symbols from the MAIN context can be made global. 関数 global を使って、いったんコンテキストに対して透過にしてしまうと、(訳注: delete を使って削除しない限り)再びシンボルを隠すことはできません。 Once it is made visible to contexts through the global function, a symbol cannot be hidden from them again. 関数 constant を使うことによって、 シンボルは設定され、同時に変更から保護されます: By using the constant function, symbols can be both set and protected from change at the same time:. constant と global の両方が必要なシンボルを一遍に定義できます: A symbol needing to be both a constant and a global can be defined simultaneously:.
現在のコンテキストで constant により保護されたシンボルを再び上書きできるのは、関数 constant の使用です。(訳注:現在のコンテキストのシンボルにしか constant を使えません)。 これにより、他のコンテキストにおけるコードによる上書きからシンボルが保護されます。 In the current context, symbols protected by constant can be overwritten by using the constant function again.
This protects the symbols from being overwritten by code in other contexts. コンテキスト内でコンテキスト 自身 のシンボルを先付けすることにより、グローバルにされたシンボルや組込関数のシンボルを上書きできます: Global and built-in function symbols can be overwritten inside a context by prefixing them with their own context symbol:.
この例では、組込関数 new が異なる関数として、コンテキスト Account 専用の Account:new に上書きされます。 In this example, the built-in function new is overwritten by Account:new , a different function that is private to the Account context. 関数を書く時、実行中に異なるコンテキストを参照する必要がある場合や、定義中に存在しないコンテキストを使う必要がある場合には、コンテキスト変数が使えます: Context variables are useful when writing functions, which need to refer to different contexts during runtime or use contexts which do not exist during definition:.
続いては、上記定義を使ったターミナル・セッションを示します。 プログラムの出力はボールドで示しています: The following shows a terminal session using above definitions. The program output is shown in bold-face:. 関数 update は第一変数として渡されるコンテキスト次第で、同じ関数でも異なる動作を表示します。 The same one function update can display different behavior depending on the context passed as first parameter.
コンテキストを生成する時あるいはロードする時の一連の手続き(訳注: コンテキストでのシンボル生成 を参照)が予期しない結果をもたらすことがあります。 demo と呼ばれるファイルに次のコードを入力してみてください: The sequence in which contexts are created or loaded can lead to unexpected results. Enter the following code into a file called demo :.
ファイルのロードが FOO についてのエラー・メッセージを出しますが、 ABC に対しては出しません。 最初のコンテキスト FOO がロードされた時、コンテキスト ABC はまだ存在しないのでローカル変数 FOO:ABC が生成されます。 ABC のロード時には、すでに FOO がグローバル・プロテクト・シンボルとして存在し、正常にプロテクトのフラグがセットされています。(訳注:だから FOO のエラーになったのです。) Loading the file causes an error message for FOO , but not for ABC.
When the first context FOO is loaded, the context ABC does not exist yet, so a local variable FOO:ABC gets created. When ABC loads, FOO already exists as a global protected symbol and will be correctly flagged as protected.
この場合でも、コンテキスト ABC で FOO をローカル変数として使うことは可能で、 ABC:FOO という風に明示的にコンテキストを先付けします。 FOO could still be used as a local variable in the ABC context by explicitly prefixing it, as in ABC:FOO. newLISP ではソースをモジュールに区分けするために、主にコンテキストを使います。 こうすることで各モジュールが異なる名前空間で動作するので、モジュールはレキシカルに分離され、他のモジュールに同一のシンボル名があっても衝突しません。 Contexts in newLISP are mainly used for partitioning source into modules.
Because each module lives in a different namespace, modules are lexically separated and the names of symbols cannot clash with identical names in other modules. newLISP 配布の一部である modules には、モジュール・ファイルに関連する関数を置く方法や newLISPdoc ユーティリティを使ってモジュールを文書化する方法などの例があります。 The modules , which are part of the newLISP distribution, are a good example of how to put related functions into a module file, and how to document modules using the newLISPdoc utility.
最良のプログラミング習慣は、一ファイルが一モジュールを含み、ファイル名は使っているコンテキスト名と同じでなくとも、似ていることです: For best programming practice, a file should only contain one module and the filename should be similar if not identical to the context name used:. この例では、予め変数を定義しておく良い習慣を示しています。名前空間内のグローバル変数を定義したり、変化しない変数を constant として定義したりしておくことです。 The example shows a good practice of predefining variables, which are global inside the namespace, and defining as constants the variables that will not change.
ファイルが一個以上のコンテキストから構成されるなら、コンテキストの終りに MAIN への切り替えを明示しておくべきです: If a file contains more than one context, then the end of the context should be marked with a switch back to MAIN :. コンテキストはデータ・コンテナとしてよく使われます。例えばハッシュ似の辞書や設定データのようなものです: Contexts are frequently uses as data containers, e. for hash-like dictionaries and configuration data:.
名前空間 Config をロードすると、全ての変数をメモリに一度で設定できます: Loading the Config namespace will now load a whole variable set into memory at once:. これに関する詳細は コンテキスト・オブジェクトの 直列化 ( シリアライズ ) の章で読んでください。 Read more about this in the section Serializing contexts. モジュール・ファイルは、関数 load を使ってロードされます。 プログラミング・プロジェクトが互いに参照する多数のモジュールからなる時、コンテキストをロードする前に起こり得るコンテキストの前方参照による問題を避けるために、コンテキストを予約宣言できます。 Module files are loaded using the load function. If a programming project contains numerous modules that refer to each other, they can be pre-declared to avoid problems due to context forward references that can occur before the loading of that context.
この例が示すように予約宣言してからロードすれば、宣言やロードの一連の手続き(訳注: コンテキストでのシンボル生成 を参照)を気にする必要がありません。 まだロードされていないモジュールの変数や定義への前方参照が、全ての正しく翻訳されるからです。 コンテキスト・シンボルの誤用は、コンテキストがロードされる前に、エラー・メッセージが出ます。 When pre-declaring and loading modules as shown in the example, the sequence of declaration or loading can be neglected.
All forward references to variables and definitions in modules not loaded yet will be translated correctly. Wrong usage of a context symbol will result in an error message before that context is loaded. コンテキスト切り替えで始まっていないモジュールは、常に MAIN にロードされます。ただし、 load 宣言文の最後のオプションで目標コンテキストを指定している時は別です。 リモート位置から HTTP 経由でモジュールをロードする際は、関数 load の引数に URL を取れます。 Modules not starting with a context switch are always loaded into MAIN except when the load statement specifies a target context as the last parameter.
The load function can take URL s to load modules from remote locations, via HTTP. load 宣言文終了後の現在のコンテキストは、常に load の前と同じです。 The current context after the load statement will always be the same as before the load.
直列化 ( シリアライズ ) することは、ソフトウェア・オブジェクトをファイルやメモリ内の文字列に保存される文字ストリームに置き換えることで 持続性 をもたらします。 newLISP では、シンボルで参照されるもの全てが関数 save を使って、ファイルに 直列化 ( シリアライズ ) 可能です。 シンボルと同様、コンテキストもコンテキスト名を使って保存されます: Serialization makes a software object persistent by converting it into a character stream, which is then saved to a file or string in memory. In newLISP, anything referenced by a symbol can be serialized to a file by using the save function.
Like other symbols, contexts are saved just by using their names:. 詳細については、関数 save 上記内容 と source newLISP 文字列への 直列化 ( シリアライズ ) を見てください。 For details, see the functions save mentioned above and source for serializing to a newLISP string. デフォルト・ファンクタ または デフォルト・ファンクション は、その名前空間と同じ名前を持つシンボルかユーザ定義関数かマクロです。 コンテキストを関数の名前として使う時、またはs式の関数位置で使う時、 newLISP はデフォルト・ファンクションを実行します。 A default functor or default function is a symbol or user-defined function or macro with the same name as its namespace.
When the context is used as the name of a function or in the functor position of an s-expression, newLISP executes the default function. デフォルト・ファンクションが MAIN と違うコンテキストから呼ばれる時には、コンテキストがすでに存在しているか、コンテキストと関数シンボルを生成する 前方宣言 が宣言されている必要があります: If a default function is called from a context other than MAIN , the context must already exist or be declared with a forward declaration , which creates the context and the function symbol:.
デフォルト・ファンクションはグローバル関数のように動作しますが、 それが呼ばれているコンテキストからはレキシカルに分離しています。 Default functions work like global functions, but they are lexically separate from the context in which they are called. ラムダ関数やラムダ・マクロのように、デフォルト・ファンクションを map や apply で使うことができます。 Like a lambda or lambda-macro function, default functions can be used with map or apply.
デフォルト・ファンクションはその名前空間内にあるレキシカルに隔離された静的変数を更新できます: A default function can update the lexically isolated static variables contained inside its namespace:. 関数 Gen が初めて呼ばれると、加算器に引数の値が設定されます。 関数が続けて呼ばれる度に Gen の加算器に引数の値が加算されていきます。 The first time the Gen function is called, its accumulator is set to the value of the argument.
Each successive call increments Gen 's accumulator by the argument's value. この Gen:Gen の定義は、 context 'Gen と context MAIN 宣言文で囲むこと無しに、関数を関数名と同じ名前空間に置く方法を示しています。 この場合、明示的に名前空間を先付けしたシンボルだけが、コンテキスト Gen の中に置かれます。 上記例では、変数 x は MAIN の部品のままです。 The definition of Gen:Gen shows, how a function is put in its own namespace without using the surrounding context 'Gen and context MAIN statements.
In that case only symbols qualified by the namespace prefix will end up in the Gen context. In the above example the variable x is still part of MAIN. どちらの方法も MyHash の辞書空間とデフォルト・ファンクタを作ることができます。 二番目の手段の方が安全で、デフォルト・ファンクタ MyHash:MyHash を変更から守ることができます。 辞書として使う時は、名前空間の デフォルト・ファンクタ に nil を入れておく必要があります。 シンボル名に使える文字列は文字に制限され、コンテキストで使われるシンボル名にはアンダースコアが内部処理で先付けされます。 キー・値対の生成と(訳注:キーによる)値の呼び出しが簡単になります: Either method can be used to make the MyHash dictionary space and default functor.
The second method is safer, as it will protect the default functor MyHash:MyHash from change. The default functor in a namespace must contain nil to be used as a dictionary. The string used for the symbol name is limited to characters and internally an underscore is prepended to the symbol name used in the context. Creating key-value pairs and retrieving a value is easy:. この方法で作られるシンボル変数は、スペースや通常 newLISP のシンボル名としては許されない文字を含むこともできます: Symbol variables created this way can contain spaces or other characters normally not allowed in newLISP symbol names:.
エントリに nil を設定することは、そのエントリを名前空間から実際に削除します。 Setting an entry to nil will effectively delete it from the namespace. 名前空間の内容から連想リストが生成できます: An association list can be generated from the contents of the namespace:. 多くの組込関数と同じように、ハッシュ式はその内容を直接変更可能な参照として返します: Like many built-in functions hash expressions return a reference to their content which can be modified directly:. ハッシュ値は setf を使っても変更可能です: Hash values also can be modified using setf :. 図 5 構成プロバイダー クラス モデル. 構成メカニズムの各種類には、対応する構成プロバイダー クラスがあり、それぞれ IConfigurationProvider を実装しています。組み込みプロバイダー実装の大部分では、インターフェイス メソッドのすべてのカスタム実装を使用しなくても、ConfigurationBuilder から派生することで、実装を効率よく始めることができます。驚かれるかもしれませんが、 図 1 のどのプロバイダーへの直接参照もありません。それは、手動で各プロバイダーのインスタンスを作成して ConfigurationBuilder クラスの Add メソッドで登録する代わりに、各プロバイダーの NuGet パッケージに IConfigurationBuilder 拡張メソッドを持つ静的拡張クラスが含まれているからです この拡張クラスの名前は通常、ConfigurationExtensions というサフィックスで識別できます 。拡張クラスを使用して、ConfigurationBuilder IConfigurationBuilder を実装 の構成データに直接アクセスを開始し、プロバイダーに関連した拡張メソッドを直接呼び出すことができます。たとえば、JsonConfigurationExtensions クラスは、AddJsonFile 拡張メソッドを IConfigurationBuilder に追加し、ConfigurationBuilder.
AddJsonFile fileName, optional. Build ; への呼び出しを使用して JSON 構成を追加できるようにします。. IConfiguration には、キーを使用して目的の要素にアクセスして、特定の構成値を取得できるようにする文字列インデクサーが含まれています。一連の設定 セクションと呼ばれる は、GetSection メソッドまたは GetChildren メソッドで取得できます どちらのメソッドを使用するかは、階層の追加レベルをドリルダウンするかどうかによります 。構成要素のセクションでは、以下を取得できます。.
場合によっては、クリア テキストで格納された設定ではなく、暗号化された設定が取得されるよう希望することがあります。たとえば、OAuth アプリケーションのキーやトークンを格納する場合や、データベース接続文字列の資格情報を格納する場合に、このような暗号化が重要になります。さいわい、Microsoft. Configuration システムでは、暗号化された値の読み取りに関する組み込みのサポートがあります。セキュアなストアにアクセスするには、Microsoft. AddUserSecrets 拡張メソッドを使用します。このメソッドは、 project. json ファイルに格納されている userSecretsId という構成項目文字列引数を受け取ります。UserSecrets 構成を構成ビルダーに追加すると、設定に関連付けられたユーザーのみがアクセスできる暗号化された値の取得を開始できます。.
NET 5 の新しいプロジェクト ウィザードで既定で作成される project. json ファイルに格納された userSecretsId の値に関連付けることができます。user-secret ツールがない場合は、開発者コマンド プロンプトで DNX ユーティリティ 現在の名前は dnu. exe を使用して追加する必要があります。. ユーザー シークレット構成オプションの詳細については、Rick Anderson と David Roth による記事「アプリケーション シークレットの安全な格納」 bit. NET を長年使用してきた開発者は、System. Configuration による構成の組み込みサポートに失望していたことでしょう。従来の ASP. NET 出身の開発者であれば、なおさらだと思います。ASP. NET では、構成は Web. Config と App. config ファイルに限られており、そのファイルの AppSettings ノードにアクセスするだけでよかったのですから。さいわい、新しいオープン ソースの Microsoft.
Configuration API では、多数の新しい構成プロバイダーと、必要な任意のカスタム プロバイダーにプラグイン可能な容易に拡張できるシステムを追加することで、本来利用できた機能をはるかに超える機能を利用できるようになっています。ASP. NET 5 以前の環境でまだ仕事をしている 身動きが取れない? 開発者にとって、古い System. Configuration API は依然機能しますが、 併用することになるとしても 新しいパッケージを参照して新しい API への移行を徐々に開始することができます。さらに、NuGet パッケージは、コンソールなどの Windows クライアント プロジェクトや Windows Presentation Foundation アプリケーションから使用できます。そのため、次回構成データにアクセスする必要があるときには、Microsoft. Configuration API を利用しない手はありません。. Mark Michaelis は、IntelliTect の創設者で、同社でチーフ テクニカル アーキテクト兼トレーナーを務めています。20 年にわたって Microsoft MVP の一員であり、 年から Microsoft Regional Director を務めています。また、C 、Microsoft Azure、SharePoint、Visual Studio ALM など、マイクロソフト ソフトウェアの設計レビュー チームにもいくつか所属しています。開発者を対象としたカンファレンスで講演を行い、多数の書籍を執筆しています。最近では、『Essential C 6.
Michaelis 、英語 、ブログ IntelliTect. com 英語のみ です。. この記事のレビューに協力してくれた IntelliTect の技術スタッフの Grant Erickson、Derek Howard、Phil Spokas、および Michael Stokesbary に心より感謝いたします。.
メイン コンテンツにスキップ. このブラウザーはサポートされなくなりました。 Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。 Microsoft Edge をダウンロードする Internet Explorer と Microsoft Edge の詳細情報.
No comments:
Post a Comment