質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Q&A

解決済

3回答

285閲覧

C言語で関数の処理内容自体の変換は可能か?

tokuo0

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

0グッド

1クリップ

投稿2018/08/18 09:16

編集2018/08/18 12:03

JavaScriptの例を下記に示しますが、
「odd=not(even)」で関数の処理内容自体を変換することが可能です。
これを単純にCに書き換えられないか
試みましたが、「not」の書き方で
躓いてしまいました。
書きかけのCのコードを
JavaScriptの例の下側に示します。
「not()」の部分の記述は仮のものです。
そもそも、この処理は
Cで書けるのでしょうか?
御教授下さい。

lang

1// JavaScriptの例 2 3importPackage(java.lang) 4print=function(x){ 5 System.out.print(x+' ')} 6 7not=function(predicate) 8{ 9 return function(arg) 10 { 11 return!predicate(arg) 12 } 13} 14 15multipleOf=function(n) 16{ 17 return function(m) 18 { 19 if(m%n===0) 20 { 21 return true 22 } 23 else 24 { 25 return false 26 } 27 } 28} 29 30even=multipleOf(2) 31odd=not(even) 32 33print(odd(2)) 34print(odd(3))

lang

1// C言語による書き換えを試みた途中結果 2 3#include<stdio.h> 4 5#define FALSE 0 6#define TRUE !FALSE 7 8void print(int x){printf("%d ",x);} 9 10int _n; 11int _multipleOf(int m) 12{ 13 if(m%_n==0) 14 { 15 return TRUE; 16 } 17 else 18 { 19 return FALSE; 20 } 21} 22 23int(*multipleOf(int n))() 24{ 25 _n=n; 26 return _multipleOf; 27} 28 29int (*not(int(*f)()))() 30{ 31 // 変換せずに返すので「 even()」のまま 32 return f; 33} 34 35int main() 36{ 37 int(*even)(),(*odd)(); 38 39 even=multipleOf(2); 40 odd=not(even); 41 42 print(odd(2)); 43 print(odd(3)); 44}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

関数ポインタですね。ソースの例を無視して申し訳ないのですが、核心を手短に説明すっるために、違う例を使わせてください。

#include <stdio.h> int f0(int a,int b) {return a+b ;} int f1(int a,int b) {return a-b ;} int main(int argc,char **argv) { int a,b,(*vf)(int a,int b) ; vf = &f0 ; printf("%4d\n",(*vf)(10,10)); vf = &f1 ; printf("%4d\n",(*vf)(10,10)); return 0; }

関数f0,f1への入り口だけをvfに代入しています。
CはJavaScriptに比べて型の処理に自由度が無いので、同じ型の関数でないと、代入はできません。
もっと他の言語だと、関数の一部だけを変更したり追加したりできます。
関数名を合成することができる言語もあります。何を言っているのかわからないと思いますが、例を見てください。

proc f_0_0 {b c} {return [expr $b+$c] ;} proc f_1_0 {b c} {return [expr $b*$c] ;} proc f_0_1 {b c} {return [expr $b-$c] ;} set x 0 ;set y 0 ;puts [f_${x}_${y} 10 10] set x 1 ;set y 0 ;puts [f_${x}_${y} 10 10] set x 0 ;set y 1 ;puts [f_${x}_${y} 10 10]

TCLで関数を仮想化する仕組みは、JavaScriptのラムダ、Cの関数へのポインタとは全く異なり純粋に文字列を作るだけです。

投稿2018/08/18 11:48

gm300

総合スコア580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

C言語では、(自分で機械語をメモリに作り上げるというような言語外の手段を除けば)動的に関数を生成する手段はありません。

C++の場合、operator()をオーバーロードしたオブジェクト(関数オブジェクト)を作ることで、関数のようなものを動的生成できます。

投稿2018/08/18 11:23

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C言語で実現できないのは既出の回答の通りです。C++であればラムダ式を使うことができます。
[=]という表現でスコープに保持されている値を利用することができます。

サンプルコード

C++

1#include <iostream> 2#include <functional> 3 4void print(bool x) 5{ 6 std::cout << std::boolalpha << x << std::endl; 7} 8 9auto multipleOf(int n) 10{ 11 return [=](int m) { 12 if (m % n == 0) { 13 return true; 14 } 15 else { 16 return false; 17 } 18 }; 19} 20 21auto notOf(std::function<bool(int)> predicate) 22{ 23 return [=](int arg) { 24 return !predicate(arg); 25 }; 26} 27 28int main() 29{ 30 auto even = multipleOf(2); 31 auto odd = notOf(even); 32 33 print(odd(2)); 34 print(odd(3)); 35}

投稿2018/08/18 11:36

reosablo

総合スコア339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問