問題タブ [callcc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
lambda - マクロの一部だけを衛生的にする方法
lambda
という名前の のバージョンがlambda-r
欲しいのですが、そこから ができreturn
ます。例:
これにより、値が得られます6
。値が 7 であることを期待するかもしれませんが、2 に到達する前にラムダ式から 1 が返されるため、6 です。
これは、私が探している種類の変換の例です。次のように使用するlambda-r
とします。
私はそれを次のように変換したい:
これは、内部定義の代わりに let 式で表現することもできますが、わかりやすくするために定義を使用しています。
上記のコードは実際には期待どおりに機能することに注意してください。問題は、マクロlambda-r
として表現するのに苦労していることです。理由は、衛生的でありたいが、衛生的でありたくないからです。k
v
return
現時点での私のマクロは次のとおりです。
return
は衛生的に扱われ、その結果、使用時に直接見えないため、これは機能しませんlambda-r
。そのため、有効な識別子(lambda-r () (return 1))
ではないというエラーが表示されます。return
編集: Nathan Sanders の回答のおかげで、ここで何をしなければならないかを理解することに近づいています。ただし、次の手順を完全には理解していないため、これをまだ機能させることができていません。以下を説明するリソースについて説明/案内していただければ幸いです。
syntax
手順_datum->syntax
/syntax->datum
手順_
編集:気にしないでください-私は今それを手に入れました:)
lisp - call-with-current-continuationは、ラムダとクロージャでのみ実装できますか?
call/cc
ラムダとクロージャだけで実装できるかどうか誰かが知っていますか?
プログラムのフローを(例外のように)中断するようですcall/cc
が、ラムダとクロージャはそれを行うことができません。call/cc
したがって、ラムダとクロージャを介して実装することはできないと思います。
他にアイデアはありますか?
c# - c#5.0の新しい非同期機能をcall / ccでどのように実装できますか?
私はasync
c#5.0に含まれる新機能に関する新しい発表をフォローしています。私は、継続渡しスタイルと、新しいc#コンパイラがEric Lippertの投稿からのこのスニペットのようなコードに変換することについての基本的な理解を持っています:
一部の言語は、call-with-current-continuation(callcc
)を介してネイティブに継続を実装していることは知っていますが、それがどのように機能するのか、または正確に何をするのかはよくわかりません。
だからここに質問があります:アンダースらの場合。弾丸を噛み、/特殊なケースcallcc
の代わりにc#5.0で実装することにした場合、上記のスニペットはどのようになりますか?async
await
scope - 奇妙な場所でスキームの継続が再起動する
アップデート:
したがって、問題はジェネレーターにあるようであり、必ずしも next-token および lookahead 関数にあるとは限りません。set!s が発生している場所に表示呼び出しを追加したところ、(generate-token) が 2 回目に呼び出された後、最初に呼び出された場所から実行が再開されることが問題であることがわかりました。
プログラムの完全なコードは次のとおりです (参照用に元の投稿を以下に残しました)。
以下の元の投稿の最初の例に従って、次のトークンと先読み呼び出しを実行すると、次の結果が得られます。
なぜこのように振る舞うかについては途方に暮れていますが、私は継続に不慣れであり、おそらくその影響を完全には理解していないことを認めます。いつものように、どんな助けでも大歓迎です。
ありがとう。
元の投稿は次のとおりです。
テキスト ファイルを解析し、一度に 1 つのトークンを文字列として返すジェネレータを作成しました。したがって、次を含むファイルがある場合
(generate-token) を連続して呼び出すと、それぞれ「these」「are」「my」... が返されます。これは機能しているように見えますが、これはより大きな割り当てのパーサーの一部として書いたものです。ジェネレーターは順調に動作しているようですが、トークンのストリームを解析するために LR(1) パーサーを構築しているため、先読みを実行できる必要があります。そのために、次のプログラムを作成しました。
ただし、これらは期待どおりに機能しません。スキーム (これは drRacket で記述されていますが、#lang r5rs を使用しています) はオブジェクトを値で渡すという印象を受けています。 :
別のフローでは、(先読み) が最初に呼び出された場合、正しく動作します。
何が起こっているのかについて手がかりがあれば、どんな洞察も大歓迎です。開示: これは学校の課題ですが、私に代わってやるように頼んでいるわけではありません >.>.
functional-programming - CPS を書き換えるためのマクロはありますか?
たとえば、2 つの非同期メソッドがあります。
しかし、私は似たようなものを書きたい
scheme - Schemeでcall/ccに頭を悩ませているようには見えない
誰かがそれがどのように機能するかについての良いガイドを持っていますか?視覚的な補助機能を備えたものがあればいいのですが、私が出会ったすべてのガイドは、私がそれを新たに取り入れることが必要なのと同じことを言っているようです。
lua - スキーム内のコルーチン (R5RS)
だから私は最初に lua でコルーチンの概念に出くわし、lua の実装は多かれ少なかれ理解できました..私は今スキームを学んでおり、同じ機能が call/cc で実装されていることを理解していますが、少し問題があります.これを達成するための正確な方法について頭を悩ませています。誰でも簡単なチュートリアルや主題に関する何かを知っていますか?
functional-programming - 「call/cc」を使用して「if」を実装できますか?
「call/cc」を使用して任意の制御フロー構造を実装できると聞いたので、「call/cc」を使用してそのようなすべての構造を実装しようとしていますが、問題が発生しています。「if」がないと仮定すると、「define-syntax」と「call/cc」を使用してどのように実装しますか? それは可能ですか、それとも私は誤解されていますか? 「call/cc」を使用して無条件ジャンプを実装する方法は知っていますが、マシンレベルでは、実行がプロセッサのステータスビットに依存する分岐命令で条件付き実行が実行されます。このタイプの構造がなければ、それがどのように行われるかわかりません。
haskell - callCCをより動的にする方法は?
ContTの正しいタイプは
およびその他の制御演算子
残念ながら、callCC
タイプチェックができず、その方法がわかりません。なんとかチェックshift
してreset
タイプチェック
しかし、それでも、このような再帰的なジャンプでshift
は使用できませんか?reset
誰かがこれを以前に試したことがありますか?
javascript - クロージャー付きの通話/CC
ウィキペディアは、「クロージャーと適切な末尾呼び出しをサポートする言語では、継続渡しスタイルでプログラムを記述し、call/cc を手動で実装することが可能です」と述べています。
たとえばjavascriptでこの関数をどのように実装しますか? javascript が tco を実行しないことはわかっていますが、スタック領域が不足しないことを前提としています。