No.2ベストアンサー
- 回答日時:
>もう一つ質問ですが、lambdaを使った理由はなんでしょう?
それは、mjordan23さんのコーディングスタイルがそうなのかな、って思ったから、です。例示ではlambda使ってますよね?
まあ、僕だったらこう書く方が好きですが。
(define (test num)
(values
(+ num num)
(* num num)))
> (test 4)
8
16
>
>実行してみるとエラーになりましたが、理由がまだよく分かりません。
ああ、MITスタイルの構文糖衣だとそう言う書き方はしません。
次が正解ですね。
(define (test num)
(values
(+ num num)
(* num num)
(/ num num)))
> (test 4)
8
16
1
>
ですね。
どこ違うか分かります?一行目の括弧の「付け方」が違うんですよ。
この辺、まあ、例えばCommon LispとかEmacs Lisp触った事がある、ってのならたまに間違えちゃうんですけどね(笑)。
Common Lispだと確かにmjordan23さんみたいに書きますから。
(defun test (num)
(values
(+ num num)
(* num num)
(/ num num)))
TEST
CL-USER> (test 4)
8
16
1
CL-USER>
Schemeの構文糖衣では
「手続き名と引数を纏めて括弧でくくる」
のが流儀なんで、覚えておいてください。
まあ、これは実際に「手続き実行のスタイルになってる」って事ですね。
No.1
- 回答日時:
>複数の関数を連続で実行できると思う
ええとですね。
実は内部的にはきちんと(+ num num)ってのは実行されています。
ただSchemeでは、defineによる手続き定義の場合、「全体としての返り値」になるのは「最後の式の評価結果」なんです。これが原則です。
つまり、「実行されてても」返り値になるとは限らないんで、結局、インタプリタ上で表示されるとは限りません。
両方返り値にしたい場合は、多値を返す手続きvaluesを用いて
(define test
(lambda (num)
(values
(+ num num)
(* num num))))
> (test 4)
8
16
>
とする手が一つ。
あるいは、単に「印字させたい」だけで別に返り値にしたいわけじゃない、って場合はdisplayを差し込むのも手です。
(define test
(lambda (num)
(display (+ num num))
(newline) ;改行指定
(* num num)))
> (test 4)
8
16
>
これは前者のコードの実行結果と「見た目似てます」が、前者は本当に多値で8と16を「testの実行結果として返してる」んですが、後者は「testの実行結果はあくまで16」です。単に8は「印字されているだけ」ですね(Scheme用語で言うと「副作用」ってヤツです)。
あとは、簡単に、全部リストにして返しちゃえ、ってのも当然一つの解でしょう。
(define test
(lambda (num)
(list
(+ num num)
(* num num))))
> (test 4)
(8 16)
>
これは返り値を数値とせず、リストにしちゃったパターンですよね。
この回答への補足
valuesのことは知りませんでした。ありがとうございます。
もう一つ質問ですが、lambdaを使った理由はなんでしょう?
(define test (num)
(values
(+ num num)
(* num num)
(/ num num)))
ではいけないんですか?実行してみるとエラーになりましたが、理由がまだよく分かりません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- PHP カラーミーショップのSmartyでの文字列抜き出し 2 2022/05/06 11:51
- その他(プログラミング・Web制作) python の課題で困ってます。 num=【1,2,8,6】という配列がある。 insert(2, 2 2023/05/24 21:56
- その他(プログラミング・Web制作) pythonで変数にオブジェクトを代入するにはどうしたらよいでしょうか 2 2023/08/20 20:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETで他のEXEを実行させる
-
シェルスクリプトに引数を渡す...
-
if文の条件に関数が入ってる場...
-
Audioサービスが実行されていま...
-
onedriveで同期解除をしたら、...
-
vlan internal allocation poli...
-
沢山のフォルダにあるファイル...
-
マイドキュメントのフォルダの...
-
teratarmでコマンド入力すると...
-
ファイルをコピーしたとき、も...
-
TXTファイルを上書き保存する前...
-
ls であるファイル以外を表示し...
-
読み取り専用ファイルを上書き...
-
パワーポイントのデータを誤っ...
-
共有しているファイルを削除し...
-
USBデータの消失
-
サブディレクトリも含めて最新...
-
NETBIOSドメイン名の変更について
-
WindowsからSSHでサーバーにあ...
-
外付けHDDの データ復元
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETで他のEXEを実行させる
-
if文の条件に関数が入ってる場...
-
ファイル名の日付について教え...
-
C#で他のPCのサービスの起動...
-
シェルスクリプトに引数を渡す...
-
Word・Excelの「Ctrl+Y」につい...
-
マシンをスタンバイの状態にし...
-
再質問 コンボボックス リス...
-
コマンドプロンプトにてコマン...
-
C言語,if文の条件式について
-
Schemeで複数の関数を連続で実...
-
WindowsでPythonで外部コマンド...
-
VBSでクエリを実行→クエリでテ...
-
onedriveで同期解除をしたら、...
-
vlan internal allocation poli...
-
teratarmでコマンド入力すると...
-
沢山のフォルダにあるファイル...
-
YAHAMA RTXシリーズのコマンド...
-
マイドキュメントのフォルダの...
-
共有しているファイルを削除し...
おすすめ情報