D Pemrograman - Fungsi

Bab ini menjelaskan fungsi-fungsi yang digunakan dalam pemrograman D.

Definisi Fungsi di D

Definisi fungsi dasar terdiri dari header fungsi dan badan fungsi.

Sintaksis

return_type function_name( parameter list ) { 
   body of the function 
}

Inilah semua bagian dari sebuah fungsi -

  • Return Type- Suatu fungsi dapat mengembalikan nilai. Itureturn_typeadalah tipe data dari nilai yang dikembalikan fungsi. Beberapa fungsi melakukan operasi yang diinginkan tanpa mengembalikan nilai. Dalam kasus ini, return_type adalah kata kuncivoid.

  • Function Name- Ini adalah nama sebenarnya dari fungsinya. Nama fungsi dan daftar parameter bersama-sama membentuk tanda tangan fungsi.

  • Parameters- Parameter seperti placeholder. Saat suatu fungsi dipanggil, Anda meneruskan nilai ke parameter. Nilai ini disebut sebagai parameter atau argumen aktual. Daftar parameter mengacu pada jenis, urutan, dan jumlah parameter suatu fungsi. Parameter bersifat opsional; artinya, suatu fungsi mungkin tidak berisi parameter.

  • Function Body - Badan fungsi berisi kumpulan pernyataan yang menentukan apa yang dilakukan fungsi.

Memanggil Fungsi

Anda dapat memanggil fungsi sebagai berikut -

function_name(parameter_values)

Jenis Fungsi di D

Pemrograman D mendukung berbagai fungsi dan mereka tercantum di bawah ini.

  • Fungsi Murni
  • Fungsi Nothrow
  • Fungsi Ref
  • Fungsi Otomatis
  • Fungsi Variadic
  • Fungsi Inout
  • Fungsi Properti

Berbagai fungsi dijelaskan di bawah ini.

Fungsi Murni

Fungsi murni adalah fungsi yang tidak dapat mengakses status global atau statis, yang dapat berubah kecuali melalui argumennya. Ini dapat mengaktifkan pengoptimalan berdasarkan fakta bahwa fungsi murni dijamin tidak akan mengubah apa pun yang tidak diteruskan kepadanya, dan dalam kasus di mana kompilator dapat menjamin bahwa fungsi murni tidak dapat mengubah argumennya, ia dapat mengaktifkan kemurnian fungsional penuh, yang adalah, jaminan bahwa fungsi tersebut akan selalu mengembalikan hasil yang sama untuk argumen yang sama).

import std.stdio; 

int x = 10; 
immutable int y = 30; 
const int* p;  

pure int purefunc(int i,const char* q,immutable int* s) { 
   //writeln("Simple print"); //cannot call impure function 'writeln'
   
   debug writeln("in foo()"); // ok, impure code allowed in debug statement 
   // x = i;  // error, modifying global state 
   // i = x;  // error, reading mutable global state 
   // i = *p; // error, reading const global state
   i = y;     // ok, reading immutable global state 
   auto myvar = new int;     // Can use the new expression: 
   return i; 
}

void main() { 
   writeln("Value returned from pure function : ",purefunc(x,null,null)); 
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Value returned from pure function : 30

Fungsi Nothrow

Fungsi Nothrow tidak menampilkan pengecualian apa pun yang diturunkan dari Exception kelas. Fungsi kedua sisi adalah kovarian dengan fungsi lempar.

Nothrow menjamin bahwa suatu fungsi tidak mengeluarkan pengecualian apa pun.

import std.stdio; 

int add(int a, int b) nothrow { 
   //writeln("adding"); This will fail because writeln may throw 
   int result; 
   
   try { 
      writeln("adding"); // compiles 
      result = a + b; 
   } catch (Exception error) { // catches all exceptions 
   }

   return result; 
} 
 
void main() { 
   writeln("Added value is ", add(10,20)); 
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

adding 
Added value is 30

Fungsi Ref

Fungsi ref memungkinkan fungsi untuk kembali dengan referensi. Ini analog dengan parameter fungsi ref.

import std.stdio;

ref int greater(ref int first, ref int second) { 
   return (first > second) ? first : second; 
} 
 
void main() {
   int a = 1; 
   int b = 2;  
   
   greater(a, b) += 10;   
   writefln("a: %s, b: %s", a, b);   
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

a: 1, b: 12

Fungsi Otomatis

Fungsi otomatis dapat mengembalikan nilai jenis apa pun. Tidak ada batasan jenis apa yang akan dikembalikan. Contoh sederhana untuk fungsi tipe otomatis diberikan di bawah ini.

import std.stdio;

auto add(int first, double second) { 
   double result = first + second; 
   return result; 
} 

void main() { 
   int a = 1; 
   double b = 2.5; 
   
   writeln("add(a,b) = ", add(a, b)); 
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

add(a,b) = 3.5

Fungsi Variadic

Fungsi variadiac adalah fungsi di mana jumlah parameter untuk suatu fungsi ditentukan saat runtime. Di C, ada batasan untuk memiliki setidaknya satu parameter. Namun dalam pemrograman D, tidak ada batasan seperti itu. Contoh sederhana ditunjukkan di bawah ini.

import std.stdio;
import core.vararg;

void printargs(int x, ...) {  
   for (int i = 0; i < _arguments.length; i++) {  
      write(_arguments[i]);  
   
      if (_arguments[i] == typeid(int)) { 
         int j = va_arg!(int)(_argptr); 
         writefln("\t%d", j); 
      } else if (_arguments[i] == typeid(long)) { 
         long j = va_arg!(long)(_argptr); 
         writefln("\t%d", j); 
      } else if (_arguments[i] == typeid(double)) { 
         double d = va_arg!(double)(_argptr); 
         writefln("\t%g", d); 
      } 
   } 
}
  
void main() { 
   printargs(1, 2, 3L, 4.5); 
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

int 2 
long 3 
double 4.5

Fungsi Inout

Inout dapat digunakan baik untuk parameter dan jenis fungsi kembalian. Ini seperti template untuk mutable, const, dan immutable. Atribut mutabilitas disimpulkan dari parameter. Berarti, inout mentransfer atribut mutabilitas yang disimpulkan ke tipe pengembalian. Contoh sederhana yang menunjukkan bagaimana mutabilitas berubah ditunjukkan di bawah ini.

import std.stdio;

inout(char)[] qoutedWord(inout(char)[] phrase) { 
   return '"' ~ phrase ~ '"';
}

void main() { 
   char[] a = "test a".dup; 

   a = qoutedWord(a); 
   writeln(typeof(qoutedWord(a)).stringof," ", a);  

   const(char)[] b = "test b"; 
   b = qoutedWord(b); 
   writeln(typeof(qoutedWord(b)).stringof," ", b); 

   immutable(char)[] c = "test c"; 
   c = qoutedWord(c); 
   writeln(typeof(qoutedWord(c)).stringof," ", c); 
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

char[] "test a" 
const(char)[] "test b" 
string "test c"

Fungsi Properti

Properti memungkinkan penggunaan fungsi anggota seperti variabel anggota. Ini menggunakan kata kunci @property. Properti ditautkan dengan fungsi terkait yang mengembalikan nilai berdasarkan persyaratan. Contoh sederhana untuk properti ditunjukkan di bawah ini.

import std.stdio;

struct Rectangle { 
   double width; 
   double height;  

   double area() const @property {  
      return width*height;  
   } 

   void area(double newArea) @property {  
      auto multiplier = newArea / area; 
      width *= multiplier; 
      writeln("Value set!");  
   } 
}

void main() { 
   auto rectangle = Rectangle(20,10); 
   writeln("The area is ", rectangle.area);  
   
   rectangle.area(300); 
   writeln("Modified width is ", rectangle.width); 
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

The area is 200 
Value set! 
Modified width is 30